summaryrefslogtreecommitdiff
path: root/themes/okadmin/public/js/app.js
diff options
context:
space:
mode:
Diffstat (limited to 'themes/okadmin/public/js/app.js')
-rw-r--r--themes/okadmin/public/js/app.js346
1 files changed, 309 insertions, 37 deletions
diff --git a/themes/okadmin/public/js/app.js b/themes/okadmin/public/js/app.js
index 4b8d98f..9891298 100644
--- a/themes/okadmin/public/js/app.js
+++ b/themes/okadmin/public/js/app.js
@@ -1,61 +1,333 @@
var OKAdmin = function(){
-
- OKUpload.bind()
- OKUpload.add = function(data){
- var url = data[0].extra.Location
- add_image(url)
- }
- function add_image(url){
- var imageTemplate = $("#captioned-image-template").html()
- var $el = $(imageTemplate)
- $el.find(".uri").val(url)
- $el.find("img").attr("src", url)
- $(".captioned-image-list ol").append($el)
- }
- $(".captioned-image-list ol").sortable()
- $(".captioned-image-list ol").disableSelection()
-
- $("#add-image-url").keydown(pressEnter(function(e){
- var url = $(this).val()
- $(this).val("")
- add_image(url)
- })})
-
- $(document).on("click", ".remove-image", function(){
- if (confirm("Delete this image?")) {
+
+ // initialize our multi-image uploader with an element and a template
+ $(".group.image-list").each(function(){
+ var parent = this
+ var uploader = new OKUpload ()
+ uploader.bind( this )
+ uploader.add = function(media){
+ var url = media.url
+ var imageTemplate = $(".image-template", parent).html()
+ var $el = $(imageTemplate)
+ $el.find(".uri").val(media.url)
+ $el.find(".image-width").val(media.width)
+ $el.find(".image-height").val(media.height)
+ $el.find("img").attr("src", media.url)
+ $("ol", parent).prepend($el)
+ }
+ })
+ // delete image from gallery
+ $(document).on("mousedown", ".image-list .remove", function(){
+ if (confirm("Remove this image?")) {
$(this).parent().remove()
}
})
-
- $(".video .url").keydown(pressEnter(function(){
+
+ // Add default date
+ $('.date input').each(function(i, el){
+ var value = el.getAttribute('value')
+ if (!value) {
+ el.setAttribute('value', toDateInputValue(new Date))
+ }
+
+ function toDateInputValue (date) {
+ var local = new Date(date);
+ local.setMinutes(date.getMinutes() - date.getTimezoneOffset());
+ return local.toJSON().slice(0,10);
+ }
+ })
+
+ // initialize our multimedia uploader with an element and a template
+ $(".group.media-list").each(function(){
+ var parent = this
+ var uploader = new OKUpload ()
+ uploader.bind( this )
+ uploader.add = function(media){
+ var url = media.url
+ var imageTemplate = $(".image-template", parent).html()
+ var $el = $(imageTemplate)
+ $el.find(".uri").val(media.url)
+ $el.find(".image-width").val(media.width)
+ $el.find(".image-height").val(media.height)
+ $el.find("img").attr("src", media.url)
+ $("ol", parent).prepend($el)
+ }
+ uploader.addMedia = function(media){
+ switch (media.type) {
+ case 'youtube':
+ case 'vimeo':
+ case 'video':
+ var videoTemplate = $(".video-template", parent).html()
+ var $el = $(videoTemplate)
+ $el.addClass("loaded")
+ $el.find(".video-type").val( media.type )
+ $el.find(".video-token").val( media.token )
+ $el.find(".video-uri").val( media.uri )
+ $el.find(".video-title").val( media.title )
+ $el.find(".video-thumb").val( media.thumbnail )
+ $el.find(".video-width").val( media.width )
+ $el.find(".video-height").val( media.height )
+ $el.find("img").attr("src", media.thumbnail )
+ $("ol", parent).prepend($el)
+ break
+ case 'audio':
+ var audioTemplate = $(".audio-template", parent).html()
+ var $el = $(audioTemplate)
+ $el.addClass("loaded")
+ $el.find(".audio-type").val( media.type )
+ $el.find(".audio-token").val( media.token )
+ $el.find(".audio-uri").val( media.uri )
+ $el.find(".audio-title").val( media.title )
+ $el.find(".audio-thumb").val( media.thumbnail )
+ $el.find(".audio-duration").val( media.duration )
+ $el.find("img").attr("src", media.thumbnail )
+ $("ol", parent).prepend($el)
+ break
+ case 'link':
+ var linkTemplate = $(".link-template", parent).html()
+ var $el = $(linkTemplate)
+ $el.addClass("loaded")
+ $el.find(".uri").val( media.url )
+ $("ol", parent).prepend($el)
+ break
+ default:
+ alert("Unsupported link type!")
+ }
+ }
+ })
+ // delete image from gallery
+ $(document).on("mousedown", ".media-list .remove", function(){
+ if (confirm("Remove this media?")) {
+ $(this).parent().remove()
+ }
+ })
+
+ // initialize our single image uploader with existing DOM
+ $(".group.image").each(function(){
+ var $el = $(this)
+ var uploader = new OKUpload ()
+ uploader.bind( this )
+ uploader.add = function(media){
+ console.log(media)
+ $el.find(".uri").val(media.url)
+ $el.find(".caption").val("")
+ $el.find(".image-width").val(media.width)
+ $el.find(".image-height").val(media.height)
+ $el.find("img").attr("src", media.url).show()
+ $el.addClass("loaded")
+ }
+ })
+ // delete image from single image entry
+ $(document).on("mousedown", ".image .remove", function(){
+ if (confirm("Remove this image?")) {
+ var $el = $(this).closest(".image")
+ $el.removeClass('loaded')
+ $el.find(".uri").val("")
+ $el.find(".image-width").val("")
+ $el.find(".image-height").val("")
+ $el.find(".caption").val("")
+ $el.find("img").attr("src", "")
+ }
+ })
+
+ // make the region sortable with drag-and-drop
+ $(".media-list ol, .image-list ol, .link-list .links").sortable()
+ $(".media-list ol, .image-list ol").disableSelection()
+
+ // populate a video field with info from our url parser
+ var last_url
+ $(".video .url").on("focus", function(){
+ var $el = $(this)
+ last_url = $el.val()
+ })
+ $(".video .url").on("keydown blur", pressEnter(function(){
var $el = $(this)
var url = $el.val()
+ if (url == last_url) { return }
Parser.parse( url, function(media){
console.log(url,media)
$el.parent().addClass("loaded")
$el.parent().find(".video-type").val( media.type )
$el.parent().find(".video-token").val( media.token )
+ $el.parent().find(".video-uri").val( media.url )
$el.parent().find(".video-title").val( media.title )
$el.parent().find(".video-thumb").val( media.thumbnail )
+ $el.parent().find(".video-width").val( media.width )
+ $el.parent().find(".video-height").val( media.height )
})
- }}))
-
- $("form").submit(function(){
- $(".image-element").each(function(index){
- $(this).find("input,textarea").each(function(){
- var field = $(this).attr("name").replace(/\[\]/, "[" + index + "]")
- $(this).attr("name", field)
+ }))
+
+ // Add a new link to the list
+ $('.link-list').on('click', '.add-link-btn', function addNewLink (e) {
+ e.preventDefault && e.preventDefault()
+ e.stopPropagation && e.stopPropagation()
+ var $delegate = $(e.delegateTarget)
+ var $list = $delegate.find('.links')
+ var linkCount = $list.find("li").length
+
+ var $linkText = $delegate.find(".link-input-new.link-text")
+ var $linkURI = $delegate.find(".link-input-new.link-uri")
+
+ var template = $delegate.find(".link-template").html()
+ template = template.replace(/\[\]/g, "[" + linkCount + "]")
+ var $el = $(template)
+ $el.find(".link-text").val( $linkText.val() )
+ $el.find(".link-uri").val( $linkURI.val() )
+ $list.append($el)
+ $linkText.val("")
+ $linkURI.val("")
+ })
+
+ // Remove a link from the list
+ $('.link-list').on('click', '.remove-link-btn', function(e) {
+ e.preventDefault()
+ e.stopPropagation()
+ var $target = $(e.target)
+ $target.closest("li").remove()
+ })
+
+ // fix post indexing in list-driven inputs
+ $(".main.resource form").submit(function(e){
+ var $id = $("[name=id]"), $title = $("[name=title]"), $menu = $("[name=menu]"), $section = $(".resource.main")
+ var id = $section.data("id"), type = $section.data("type")
+
+ if ($title.length && ! $title.val()) {
+ $title.focus()
+ alert("Please enter a title")
+ e.preventDefault()
+ return
+ }
+
+ if ($menu.length && ! $menu.val()) {
+ $menu.val( $title.val() )
+ }
+
+ // TODO: pass through whether this page is static
+ if (type === "page" && (id == "contact" || id == "about")) {
+ ;
+ }
+ else {
+ var slug = slugify( $title.val() )
+ $id.val( slug )
+ }
+
+ // Parse date input
+ $('.property .date').each(function(i, el) {
+ var name = $(el).parent('.property').data('name')
+ var $input = $(el).find('input')
+ var date = new Date($input.val())
+ // Set to middle of day so it is the same date
+ // for all locales
+ date.setUTCHours(12)
+ var dateString = date.toUTCString()
+ var normalizedInput = document.createElement('input')
+ $(normalizedInput).attr({
+ name: name,
+ type: 'text',
+ value: dateString
+ })
+ $input.remove()
+ $(el).append(normalizedInput)
+ })
+
+ // Modify flags checkboxes such that unchecked ones return "false"
+ // instead of nothing
+ $('.property input[type=checkbox]').each(function(i, el) {
+ var checked = !!el.checked
+ if (!checked) {
+ el.value = 'false'
+ el.setAttribute('checked', true)
+ }
+ })
+
+ $(".link-list").each(function(){
+ var $inputs = $(this).find(".link-input-new")
+ if ($inputs.eq(0).val() && $inputs.eq(1).val()) {
+ $(this).find(".add-link-btn").trigger("click")
+ }
+ })
+
+ $("ol").each(function(){
+ $("li", this).each(function(index){
+ $(this).find("input,textarea").each(function(){
+ var field = $(this).attr("name").replace(/\[[0-9]*\]/, "[" + index + "]")
+ $(this).attr("name", field)
+ })
})
})
})
+
+ // delete individual records
+ $("#delete_form").submit(function(e){
+ if (confirm("Are you sure you want to delete this record?")) {
+ return
+ }
+ else {
+ e.preventDefault()
+ }
+ })
+
+ // reorder items in categories
+ $(".resource-category:not(.grouped)").on("click", ".edit-btn", function(e) {
+ e.preventDefault();
+ var $parent = $(e.delegateTarget)
+ var $editBtn = $parent.find(".edit-btn");
+ var $cancelBtn = $parent.find(".cancel-btn");
+ var $saveBtn = $parent.find(".save-btn");
+ var $ol = $parent.find("ol");
+ var toggles = [$parent, $cancelBtn, $saveBtn, $editBtn];
+
+ $ol.sortable();
+ $ol.disableSelection();
+ toggle();
+
+ $cancelBtn.one("click", function(e) {
+ $ol.sortable("cancel");
+ $ol.enableSelection();
+ toggle();
+ });
+
+ $saveBtn.one("click", function(e) {
+ $ol.sortable();
+ toggle();
+ });
+
+ function toggle() {
+ toggles.forEach(function($el) {
+ $el.toggleClass('active');
+ })
+ }
+ });
+
+ // save new category order
+ $(".resource-category.root").on("submit", "form", function(e) {
+ var $parent = $(e.delegateTarget);
+ var $resources = $parent.find(".resource-input")
+ var isDescending = $parent.hasClass("descending")
+ $resources.each(function(index) {
+ var $input = $(this);
+ var parsed = JSON.parse($input.val());
+ if (isDescending) {
+ parsed.__index = $resources.length - index;
+ }
+ else {
+ parsed.__index = index;
+ }
+ $input.val(JSON.stringify(parsed));
+ })
+ });
- function pressEnter(fn){
- return function(e){
- if (e.keyCode !== 13) return
+ $(window).on('keydown', function(e){
+ if ( (e.ctrlKey || e.altKey || e.metaKey) && e.keyCode == 83 ) {
e.preventDefault()
+ $("#resource_form").submit()
}
- }
+ })
+}
$(function(){
window.app = new OKAdmin ()
})
+
+
+function slugify (s){ return (s || "").toLowerCase().replace(/\s/g,"-").replace(/[^-_a-zA-Z0-9]/g, '-').replace(/-+/g, "-") }