From 4b942dcc3224504c2c3b35a7b44d5883fbbe4754 Mon Sep 17 00:00:00 2001 From: perploug Date: Mon, 7 Oct 2013 15:15:02 +0200 Subject: [PATCH] Working link picker and TinyMCE plugin --- .../plugins/umbracolink/editor_plugin_src.js | 54 -- .../plugins/umbracolink/js/umbracolink.js | 567 ------------------ .../plugins/umbracolink/langs/en_dlg.js | 1 - .../plugins/umbracolink/langs/en_us_dlg.js | 1 - .../plugins/umbracolink/langs/he_dlg.js | 1 - .../plugins/umbracolink/langs/ja_dlg.js | 1 - .../plugins/umbracolink/langs/ru_dlg.js | 54 -- .../plugins/umbracolink/langs/sv_dlg.js | 1 - .../plugins/umbracolink/langs/zh_dlg.js | 1 - .../tinymce/plugins/umbracolink/plugin.min.js | 263 ++++++++ .../src/common/services/tinymce.service.js | 17 +- src/Umbraco.Web.UI.Client/src/less/fonts.less | 18 +- src/Umbraco.Web.UI.Client/src/less/hacks.less | 12 - src/Umbraco.Web.UI.Client/src/less/main.less | 24 +- .../src/less/modals.less | 13 + .../src/less/property-editors.less | 2 - .../common/dialogs/linkpicker.controller.js | 54 +- .../src/views/common/dialogs/linkpicker.html | 28 +- .../rte/rte.prevalues.controller.js | 2 +- .../config/tinyMceConfig.Release.config | 11 +- .../config/tinyMceConfig.config | 15 +- 21 files changed, 372 insertions(+), 768 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/editor_plugin_src.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/js/umbracolink.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/en_dlg.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/en_us_dlg.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/he_dlg.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/ja_dlg.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/ru_dlg.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/sv_dlg.js delete mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/zh_dlg.js create mode 100644 src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/plugin.min.js diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/editor_plugin_src.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/editor_plugin_src.js deleted file mode 100644 index 83fe83cc85..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/editor_plugin_src.js +++ /dev/null @@ -1,54 +0,0 @@ -/** -* editor_plugin_src.js -* -* Copyright 2012, Umbraco -* Released under MIT License. -* -* License: http://opensource.org/licenses/mit-license.html -*/ - -(function () { - var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM; - - /** - * This plugin modifies the standard TinyMCE paste, with umbraco specific changes. - * - * @class tinymce.plugins.umbContextMenu - */ - tinymce.create('tinymce.plugins.UmbracoLink', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @method init - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - init: function (ed, url) { - var t = this; - - ed.execCommands.mceAdvLink.func = function () { - var se = ed.selection; - - // No selection and not in link - if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A')) - return; - - ed.windowManager.open({ - file: tinyMCE.activeEditor.getParam('umbraco_path') + '/plugins/tinymce3/insertLink.aspx', - width: 480 + parseInt(ed.getLang('advlink.delta_width', 0)), - height: 510 + parseInt(ed.getLang('advlink.delta_height', 0)), - inline: 1 - }, { - plugin_url: url - }); - }; - - } - - }); - - // Register plugin - tinymce.PluginManager.add('umbracolink', tinymce.plugins.UmbracoLink); -})(); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/js/umbracolink.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/js/umbracolink.js deleted file mode 100644 index 194e1f7141..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/js/umbracolink.js +++ /dev/null @@ -1,567 +0,0 @@ -/* Functions for the advlink plugin popup */ - -tinyMCEPopup.requireLangPack(); - -var templates = { - "window.open" : "window.open('${url}','${target}','${options}')" -}; - -function preinit() { - var url; - - if (url = tinyMCEPopup.getParam("external_link_list_url")) - document.write(''); -} - -function changeClass() { - var f = document.forms[0]; - - f.classes.value = getSelectValue(f, 'classlist'); -} - -function init() { - tinyMCEPopup.resizeToInnerSize(); - - var formObj = document.forms[0]; - var inst = tinyMCEPopup.editor; - var elm = inst.selection.getNode(); - var action = "insert"; - var html; - - /* UMBRACO SPECIFIC */ - - //document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); - //document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); - document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); - - // Link list -// html = getLinkListHTML('linklisthref','href'); -// if (html == "") -// document.getElementById("linklisthrefrow").style.display = 'none'; -// else -// document.getElementById("linklisthrefcontainer").innerHTML = html; - - // Anchor list - html = getAnchorListHTML('anchorlist','href'); - if (html == "") - document.getElementById("anchorlistrow").style.display = 'none'; - else - document.getElementById("anchorlistcontainer").innerHTML = html; - - // Resize some elements - /*if (isVisible('hrefbrowser')) - document.getElementById('href').style.width = '260px'; - - if (isVisible('popupurlbrowser')) - document.getElementById('popupurl').style.width = '180px'; - - elm = inst.dom.getParent(elm, "A"); - if (elm == null) { - var prospect = inst.dom.create("p", null, inst.selection.getContent()); - if (prospect.childNodes.length === 1) { - elm = prospect.firstChild; - } - } - - if (elm != null && elm.nodeName == "A") - action = "update"; - - formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); - - setPopupControlsDisabled(true); - - * EO UMBRACO SPECIFIC - */ - - elm = inst.dom.getParent(elm, "A"); - if (elm != null && elm.nodeName == "A") - action = "update"; - - if (action == "update") { - /* UMBRACO SPECIFIC: check local links */ - var href = validateUmbracoLink(inst.dom.getAttrib(elm, 'href')); - var onclick = inst.dom.getAttrib(elm, 'onclick'); - - // Setup form data - setFormValue('href', href); - setFormValue('title', inst.dom.getAttrib(elm, 'title')); - - /* UMBRACO SPECIFIC - - setFormValue('id', inst.dom.getAttrib(elm, 'id')); - setFormValue('style', inst.dom.getAttrib(elm, "style")); - setFormValue('rel', inst.dom.getAttrib(elm, 'rel')); - setFormValue('rev', inst.dom.getAttrib(elm, 'rev')); - setFormValue('charset', inst.dom.getAttrib(elm, 'charset')); - setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang')); - setFormValue('dir', inst.dom.getAttrib(elm, 'dir')); - setFormValue('lang', inst.dom.getAttrib(elm, 'lang')); - setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); - setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); - setFormValue('type', inst.dom.getAttrib(elm, 'type')); - setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus')); - setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur')); - setFormValue('onclick', onclick); - setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick')); - setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown')); - setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup')); - setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover')); - setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove')); - setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout')); - setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress')); - setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown')); - setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup')); - setFormValue('target', inst.dom.getAttrib(elm, 'target')); - setFormValue('classes', inst.dom.getAttrib(elm, 'class')); - - - - // Parse onclick data - if (onclick != null && onclick.indexOf('window.open') != -1) - parseWindowOpen(onclick); - else - parseFunction(onclick); - - // Select by the values - selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir')); - selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel')); - selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev')); - selectByValue(formObj, 'linklisthref', href); - */ - if (href.charAt(0) == '#') - selectByValue(formObj, 'anchorlist', href); - /* - addClassesToList('classlist', 'advlink_styles'); - - selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true); - */ - selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true); - /* - } else - addClassesToList('classlist', 'advlink_styles'); - */ - } - /* - * EO UMBRACO SPECIFIC - */ -} - -function checkPrefix(n) { - if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email'))) - n.value = 'mailto:' + n.value; - - if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external'))) - n.value = 'http://' + n.value; -} - -function setFormValue(name, value) { - document.forms[0].elements[name].value = value; -} - -function parseWindowOpen(onclick) { - var formObj = document.forms[0]; - - // Preprocess center code - if (onclick.indexOf('return false;') != -1) { - formObj.popupreturn.checked = true; - onclick = onclick.replace('return false;', ''); - } else - formObj.popupreturn.checked = false; - - var onClickData = parseLink(onclick); - - if (onClickData != null) { - formObj.ispopup.checked = true; - setPopupControlsDisabled(false); - - var onClickWindowOptions = parseOptions(onClickData['options']); - var url = onClickData['url']; - - formObj.popupname.value = onClickData['target']; - formObj.popupurl.value = url; - formObj.popupwidth.value = getOption(onClickWindowOptions, 'width'); - formObj.popupheight.value = getOption(onClickWindowOptions, 'height'); - - formObj.popupleft.value = getOption(onClickWindowOptions, 'left'); - formObj.popuptop.value = getOption(onClickWindowOptions, 'top'); - - if (formObj.popupleft.value.indexOf('screen') != -1) - formObj.popupleft.value = "c"; - - if (formObj.popuptop.value.indexOf('screen') != -1) - formObj.popuptop.value = "c"; - - formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes"; - formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes"; - formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes"; - formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes"; - formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes"; - formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes"; - formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes"; - - buildOnClick(); - } -} - -function parseFunction(onclick) { - var formObj = document.forms[0]; - var onClickData = parseLink(onclick); - - // TODO: Add stuff here -} - -function getOption(opts, name) { - return typeof(opts[name]) == "undefined" ? "" : opts[name]; -} - -function setPopupControlsDisabled(state) { - var formObj = document.forms[0]; - - formObj.popupname.disabled = state; - formObj.popupurl.disabled = state; - formObj.popupwidth.disabled = state; - formObj.popupheight.disabled = state; - formObj.popupleft.disabled = state; - formObj.popuptop.disabled = state; - formObj.popuplocation.disabled = state; - formObj.popupscrollbars.disabled = state; - formObj.popupmenubar.disabled = state; - formObj.popupresizable.disabled = state; - formObj.popuptoolbar.disabled = state; - formObj.popupstatus.disabled = state; - formObj.popupreturn.disabled = state; - formObj.popupdependent.disabled = state; - - setBrowserDisabled('popupurlbrowser', state); -} - -function parseLink(link) { - link = link.replace(new RegExp(''', 'g'), "'"); - - var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1"); - - // Is function name a template function - var template = templates[fnName]; - if (template) { - // Build regexp - var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi")); - var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\("; - var replaceStr = ""; - for (var i=0; i'); - for (var i=0; i' + name + ''; - } - - if (html == "") - return ""; - - html = ''; - - return html; -} - -function insertAction() { - var inst = tinyMCEPopup.editor; - var elm, elementArray, i; - - /* UMBRACO SPECIFIC - if there's a locallink, we'll grap that */ - if (document.forms[0].localUrl.value) { - document.forms[0].href.value = document.forms[0].localUrl.value; - } - /* EO UMBRACO SPECIFIC */ - - elm = inst.selection.getNode(); - checkPrefix(document.forms[0].href); - - elm = inst.dom.getParent(elm, "A"); - - // Remove element if there is no href - if (!document.forms[0].href.value) { - i = inst.selection.getBookmark(); - inst.dom.remove(elm, 1); - inst.selection.moveToBookmark(i); - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); - return; - } - - // Create new anchor elements - if (elm == null) { - inst.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); - - elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';}); - for (i=0; i' + tinyMCELinkList[i][0] + ''; - - html += ''; - - return html; - - // tinyMCE.debug('-- image list start --', html, '-- image list end --'); -} - -function getTargetListHTML(elm_id, target_form_element) { - var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';'); - var html = ''; - - html += ''; - - return html; -} - -// While loading -preinit(); -tinyMCEPopup.onInit.add(init); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/en_dlg.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/en_dlg.js deleted file mode 100644 index a11f69cbf5..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/en_dlg.js +++ /dev/null @@ -1 +0,0 @@ -tinyMCE.addI18n('en.advlink_dlg', { "target_name": "Target Name", classes: "Classes", style: "Style", id: "ID", "popup_position": "Position (X/Y)", langdir: "Language Direction", "popup_size": "Size", "popup_dependent": "Dependent (Mozilla/Firefox Only)", "popup_resizable": "Make Window Resizable", "popup_location": "Show Location Bar", "popup_menubar": "Show Menu Bar", "popup_toolbar": "Show Toolbars", "popup_statusbar": "Show Status Bar", "popup_scrollbars": "Show Scrollbars", "popup_return": "Insert \'return false\'", "popup_name": "Window Name", "popup_url": "Popup URL", popup: "JavaScript Popup", "target_blank": "Open in New Window", "target_top": "Open in Top Frame (Replaces All Frames)", "target_parent": "Open in Parent Window/Frame", "target_same": "Open in This Window/Frame", "anchor_names": "Anchors", "popup_opts": "Options", "advanced_props": "Advanced Properties", "event_props": "Events", "popup_props": "Popup Properties", "general_props": "General Properties", "advanced_tab": "Advanced", "events_tab": "Events", "popup_tab": "Popup", "general_tab": "General", list: "Link List", "is_external": "The URL you entered seems to be an external link. Do you want to add the required http:// prefix?", "is_email": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", titlefield: "Title", target: "Target", url: "Link URL", title: "Insert/Edit Link", "link_list": "Link List", rtl: "Right to Left", ltr: "Left to Right", accesskey: "AccessKey", tabindex: "TabIndex", rev: "Relationship Target to Page", rel: "Relationship Page to Target", mime: "Target MIME Type", encoding: "Target Character Encoding", langcode: "Language Code", "target_langcode": "Target Language", width: "Width", height: "Height" }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/en_us_dlg.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/en_us_dlg.js deleted file mode 100644 index 65703ee223..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/en_us_dlg.js +++ /dev/null @@ -1 +0,0 @@ -tinyMCE.addI18n('en_us.advlink_dlg', { "target_name": "Target Name", classes: "Classes", style: "Style", id: "ID", "popup_position": "Position (X/Y)", langdir: "Language Direction", "popup_size": "Size", "popup_dependent": "Dependent (Mozilla/Firefox Only)", "popup_resizable": "Make Window Resizable", "popup_location": "Show Location Bar", "popup_menubar": "Show Menu Bar", "popup_toolbar": "Show Toolbars", "popup_statusbar": "Show Status Bar", "popup_scrollbars": "Show Scrollbars", "popup_return": "Insert \'return false\'", "popup_name": "Window Name", "popup_url": "Popup URL", popup: "JavaScript Popup", "target_blank": "Open in New Window", "target_top": "Open in Top Frame (Replaces All Frames)", "target_parent": "Open in Parent Window/Frame", "target_same": "Open in This Window/Frame", "anchor_names": "Anchors", "popup_opts": "Options", "advanced_props": "Advanced Properties", "event_props": "Events", "popup_props": "Popup Properties", "general_props": "General Properties", "advanced_tab": "Advanced", "events_tab": "Events", "popup_tab": "Popup", "general_tab": "General", list: "Link List", "is_external": "The URL you entered seems to be an external link. Do you want to add the required http:// prefix?", "is_email": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", titlefield: "Title", target: "Target", url: "Link URL", title: "Insert/Edit Link", "link_list": "Link List", rtl: "Right to Left", ltr: "Left to Right", accesskey: "AccessKey", tabindex: "TabIndex", rev: "Relationship Target to Page", rel: "Relationship Page to Target", mime: "Target MIME Type", encoding: "Target Character Encoding", langcode: "Language Code", "target_langcode": "Target Language", width: "Width", height: "Height" }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/he_dlg.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/he_dlg.js deleted file mode 100644 index d0ef8b987b..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/he_dlg.js +++ /dev/null @@ -1 +0,0 @@ -tinyMCE.addI18n('he.advlink_dlg', { "target_name": "Target Name", classes: "Classes", style: "Style", id: "ID", "popup_position": "Position (X/Y)", langdir: "Language Direction", "popup_size": "Size", "popup_dependent": "Dependent (Mozilla/Firefox Only)", "popup_resizable": "Make Window Resizable", "popup_location": "Show Location Bar", "popup_menubar": "Show Menu Bar", "popup_toolbar": "Show Toolbars", "popup_statusbar": "Show Status Bar", "popup_scrollbars": "Show Scrollbars", "popup_return": "Insert \'return false\'", "popup_name": "Window Name", "popup_url": "Popup URL", popup: "JavaScript Popup", "target_blank": "Open in New Window", "target_top": "Open in Top Frame (Replaces All Frames)", "target_parent": "Open in Parent Window/Frame", "target_same": "Open in This Window/Frame", "anchor_names": "Anchors", "popup_opts": "Options", "advanced_props": "Advanced Properties", "event_props": "Events", "popup_props": "Popup Properties", "general_props": "General Properties", "advanced_tab": "Advanced", "events_tab": "Events", "popup_tab": "Popup", "general_tab": "General", list: "Link List", "is_external": "The URL you entered seems to be an external link. Do you want to add the required http:// prefix?", "is_email": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", titlefield: "Title", target: "Target", url: "Link URL", title: "Insert/Edit Link", "link_list": "Link List", rtl: "Right to Left", ltr: "Left to Right", accesskey: "AccessKey", tabindex: "TabIndex", rev: "Relationship Target to Page", rel: "Relationship Page to Target", mime: "Target MIME Type", encoding: "Target Character Encoding", langcode: "Language Code", "target_langcode": "Target Language", width: "Width", height: "Height" }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/ja_dlg.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/ja_dlg.js deleted file mode 100644 index 91df8efc11..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/ja_dlg.js +++ /dev/null @@ -1 +0,0 @@ -tinyMCE.addI18n('ja.advlink_dlg',{"target_name":"ターゲットの名前",classes:"クラス",style:"スタイル",id:"ID","popup_position":"位置 (X/Y)",langdir:"文章の方向","popup_size":"大きさ","popup_dependent":"依存(MozillaとFirefoxだけ)","popup_resizable":"ウインドウのサイズ変更を許可","popup_location":"アドレスバーを表示","popup_menubar":"メニューバーを表示","popup_toolbar":"ツールバーを表示","popup_statusbar":"ステータスバーを表示","popup_scrollbars":"スクロールバーを表示","popup_return":"\'return false\'を挿入","popup_name":"ウインドウの名前","popup_url":"ポップアップのURL",popup:"Javascriptポップアップ","target_blank":"新しいウインドウで開く","target_top":"トップのフレームで開く(すべてのフレームを置き換え)","target_parent":"親ウインドウ/親フレームで開く","target_same":"このウインドウ/フレームで開く","anchor_names":"アンカー","popup_opts":"オプション","advanced_props":"高度な属性","event_props":"イベント","popup_props":"ポップアップ","general_props":"一般","advanced_tab":"専門的","events_tab":"イベント","popup_tab":"ポップアップ","general_tab":"一般",list:"リンクの一覧","is_external":"入力したURLは外部のリンクのようです。リンクに http:// を追加しますか?","is_email":"入力したURLは電子メールアドレスのようです。リンクに mailto: を追加しますか?",titlefield:"タイトル",target:"ターゲット",url:"リンクのURL",title:"リンクの挿入/編集","link_list":"リンクの一覧",rtl:"右から左",ltr:"左から右",accesskey:"アクセスキー",tabindex:"タブインデックス",rev:"ターゲットからページの関係",rel:"ページからターゲットの関係",mime:"ターゲットのMIMEタイプ",encoding:"ターゲットの文字エンコーディング",langcode:"言語コード","target_langcode":"ターゲットの言語",width:"幅",height:"高さ"}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/ru_dlg.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/ru_dlg.js deleted file mode 100644 index 1bdcd71a01..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/ru_dlg.js +++ /dev/null @@ -1,54 +0,0 @@ -tinyMCE.addI18n('ru.advlink_dlg', { -"target_name": "Открыть в окне", -classes: "Классы CSS", -style: "Стиль CSS", -id: "ID", -"popup_position": "Позиционирование (X/Y)", -langdir: "Направление письма", -"popup_size": "Размер", -"popup_dependent": "Зависимость (Только Mozilla/Firefox)", -"popup_resizable": "Изменяемый размер", -"popup_location": "Показывать поле адреса", -"popup_menubar": "Покзывать строку меню", -"popup_toolbar": "Показывать панель инструментов", -"popup_statusbar": "Показывать панель состояния", -"popup_scrollbars": "Показывать прокрутку", -"popup_return": "Вставить \'return false\'", -"popup_name": "Название окна", -"popup_url": "Ссылка на источник", -popup: "Всплывающее окно JavaScript", -"target_blank": "Открыть в новом окне", -"target_top": "Открыть в главном фрейме", -"target_parent": "Открыть в родительском окне/фрейме", -"target_same": "Открыть в том же окне/фрейме", -"anchor_names": "Якоря", -"popup_opts": "Настройки", -"advanced_props": "Дополнительные свойства", -"event_props": "События", -"popup_props": "Свойства окна", -"general_props": "Общие свойства", -"advanced_tab": "Дополнительно", -"events_tab": "События", -"popup_tab": "Окно", -"general_tab": "Общее", -list: "Список ссылок", -"is_external": "Указанная Вами ссылка по всей видимости внешняя. Добавить в ее начало префикс 'http://'?", -"is_email": "Указанная Вами ссылка выглядит как адрес email. Добавить в ее начало префикс 'mailto:'?", -titlefield: "Заголовок", -target: "Назначение", -url: "Ссылка (URL)", -title: "Вставить/изменить ссылку", -"link_list": "Список ссылок", -rtl: "Справа налево", -ltr: "Слева направо", -accesskey: "Ключ доступа", -tabindex: "Порядок обхода", -rev: "Связь 'Назначение к странице'", -rel: "Связь 'Страница к назначению'", -mime: "MIME-тип назначения", -encoding: "Кодовая таблица назначения", -langcode: "Код языка", -"target_langcode": "Язык", -width: "Ширина", -height: "Высота" -}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/sv_dlg.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/sv_dlg.js deleted file mode 100644 index 0d665f99e1..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/sv_dlg.js +++ /dev/null @@ -1 +0,0 @@ -tinyMCE.addI18n('sv.advlink_dlg', { "target_name": "Målets namn", classes: "Klasser", style: "Stil", id: "ID", "popup_position": "Position (X/Y)", langdir: "Språkmål", "popup_size": "Storlek", "popup_dependent": "Dependent (Mozilla/Firefox Only)", "popup_resizable": "Make Window Resizable", "popup_location": "Show Location Bar", "popup_menubar": "Show Menu Bar", "popup_toolbar": "Show Toolbars", "popup_statusbar": "Show Status Bar", "popup_scrollbars": "Show Scrollbars", "popup_return": "Insert \'return false\'", "popup_name": "Window Name", "popup_url": "Popup URL", popup: "JavaScript Popup", "target_blank": "Öppna i ett nytt fönster", "target_top": "Öppna i toppramen", "target_parent": "Öppna i nuvarande fönster/ram", "target_same": "Öppna i detta fönster/ram", "anchor_names": "Ankare", "popup_opts": "Options", "advanced_props": "Advanced Properties", "event_props": "Events", "popup_props": "Popup Properties", "general_props": "General Properties", "advanced_tab": "Advanced", "events_tab": "Events", "popup_tab": "Popup", "general_tab": "General", list: "Link List", "is_external": "The URL you entered seems to be an external link. Do you want to add the required http:// prefix?", "is_email": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", titlefield: "Title", target: "Mål", url: "Länkens URL", title: "Infoga/redigera länk", "link_list": "Link List", rtl: "Right to Left", ltr: "Left to Right", accesskey: "AccessKey", tabindex: "TabIndex", rev: "Relationship Target to Page", rel: "Relationship Page to Target", mime: "Target MIME Type", encoding: "Target Character Encoding", langcode: "Språkkod", "target_langcode": "Målspråk", width: "Bredd", height: "Höjd" }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/zh_dlg.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/zh_dlg.js deleted file mode 100644 index bec669b5f2..0000000000 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/langs/zh_dlg.js +++ /dev/null @@ -1 +0,0 @@ -tinyMCE.addI18n('zh.advlink_dlg', { "target_name": "目标名称", classes: "类", style: "样式", id: "ID", "popup_position": "位置 (X/Y)", langdir: "语言书写方向", "popup_size": "尺寸", "popup_dependent": "依赖 (仅限Mozilla/Firefox)", "popup_resizable": "窗口大小可调", "popup_location": "显示地址栏", "popup_menubar": "显示菜单栏", "popup_toolbar": "显示工具栏", "popup_statusbar": "显示状态栏", "popup_scrollbars": "显示滚动条", "popup_return": "插入 \'return false\'", "popup_name": "窗口名称", "popup_url": "URL", popup: "JavaScript 弹出窗口", "target_blank": "在新窗口中打开", "target_top": "在顶部位置打开(替换掉所有Frames)", "target_parent": "在父级窗口或位置中打开", "target_same": "在该窗口或位置打开", "anchor_names": "锚点", "popup_opts": "选项", "advanced_props": "高级属性", "event_props": "事件", "popup_props": "弹窗属性", "general_props": "普通属性", "advanced_tab": "高级", "events_tab": "事件", "popup_tab": "弹窗", "general_tab": "普通", list: "链接列表", "is_external": "您输入的好像是外部链接,您是否想在前面添加http://?", "is_email": "您输入的好像是邮箱地址,您是否想在前面添加mailto:?", titlefield: "标题", target: "目标", url: "链接URL", title: "插入/编辑链接", "link_list": "链接列表", rtl: "从右到左", ltr: "从左到右", accesskey: "访问键", tabindex: "Tab索引", rev: "目标至页面关系", rel: "页面至目标关系", mime: "目标MIME类型", encoding: "目标语言编码", langcode: "语言代码", "target_langcode": "目标语言", width: "宽", height: "高" }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/plugin.min.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/plugin.min.js new file mode 100644 index 0000000000..8dcb849a50 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/plugin.min.js @@ -0,0 +1,263 @@ +/** + * Umbraco Link Plugin, based on the original link plugin by MoxieCode + * swapped out the dialog implementation with our own dialog service + * and support for passing in localLinks + */ + +/*global tinymce:true */ + +tinymce.PluginManager.add('umbracolink', function(editor) { + function createLinkList(callback) { + return function() { + var linkList = editor.settings.link_list; + + if (typeof(linkList) == "string") { + tinymce.util.XHR.send({ + url: linkList, + success: function(text) { + callback(tinymce.util.JSON.parse(text)); + } + }); + } else { + callback(linkList); + } + }; + } + + function showDialog(linkList) { + var data = {}, selection = editor.selection, dom = editor.dom, selectedElm, anchorElm, initialText; + var win, linkListCtrl, relListCtrl, targetListCtrl; + + function linkListChangeHandler(e) { + var textCtrl = win.find('#text'); + + if (!textCtrl.value() || (e.lastControl && textCtrl.value() == e.lastControl.text())) { + textCtrl.value(e.control.text()); + } + + win.find('#href').value(e.control.value()); + } + + function buildLinkList() { + var linkListItems = [{text: 'None', value: ''}]; + + tinymce.each(linkList, function(link) { + linkListItems.push({ + text: link.text || link.title, + value: link.value || link.url, + menu: link.menu + }); + }); + + return linkListItems; + } + + function buildRelList(relValue) { + var relListItems = [{text: 'None', value: ''}]; + + tinymce.each(editor.settings.rel_list, function(rel) { + relListItems.push({ + text: rel.text || rel.title, + value: rel.value, + selected: relValue === rel.value + }); + }); + + return relListItems; + } + + function buildTargetList(targetValue) { + var targetListItems = [{text: 'None', value: ''}]; + + if (!editor.settings.target_list) { + targetListItems.push({text: 'New window', value: '_blank'}); + } + + tinymce.each(editor.settings.target_list, function(target) { + targetListItems.push({ + text: target.text || target.title, + value: target.value, + selected: targetValue === target.value + }); + }); + + return targetListItems; + } + + function buildAnchorListControl(url) { + var anchorList = []; + + tinymce.each(editor.dom.select('a:not([href])'), function(anchor) { + var id = anchor.name || anchor.id; + + if (id) { + anchorList.push({ + text: id, + value: '#' + id, + selected: url.indexOf('#' + id) != -1 + }); + } + }); + + if (anchorList.length) { + anchorList.unshift({text: 'None', value: ''}); + + return { + name: 'anchor', + type: 'listbox', + label: 'Anchors', + values: anchorList, + onselect: linkListChangeHandler + }; + } + } + + function updateText() { + if (!initialText && data.text.length === 0) { + this.parent().parent().find('#text')[0].value(this.value()); + } + } + + selectedElm = selection.getNode(); + anchorElm = dom.getParent(selectedElm, 'a[href]'); + + data.text = initialText = anchorElm ? (anchorElm.innerText || anchorElm.textContent) : selection.getContent({format: 'text'}); + data.href = anchorElm ? dom.getAttrib(anchorElm, 'href') : ''; + data.target = anchorElm ? dom.getAttrib(anchorElm, 'target') : ''; + data.rel = anchorElm ? dom.getAttrib(anchorElm, 'rel') : ''; + + if (selectedElm.nodeName == "IMG") { + data.text = initialText = " "; + } + + if (linkList) { + linkListCtrl = { + type: 'listbox', + label: 'Link list', + values: buildLinkList(), + onselect: linkListChangeHandler + }; + } + + if (editor.settings.target_list !== false) { + targetListCtrl = { + name: 'target', + type: 'listbox', + label: 'Target', + values: buildTargetList(data.target) + }; + } + + if (editor.settings.rel_list) { + relListCtrl = { + name: 'rel', + type: 'listbox', + label: 'Rel', + values: buildRelList(data.rel) + }; + } + + var injector = angular.element(document.getElementById("umbracoMainPageBody")).injector(); + var dialogService = injector.get("dialogService"); + var currentTarget = undefined; + + //if we already have a link selected, we want to pass that data over to the dialog + if(anchorElm){ + var anchor = $(anchorElm); + currentTarget = { + name: anchor.attr("title"), + url: anchor.attr("href") + }; + + //locallink detection, we do this here, to avoid poluting the dialogservice + //so the dialog service can just expect to get a node-like structure + if(currentTarget.url.indexOf("localLink:") > 0){ + currentTarget.id = currentTarget.url.substring(currentTarget.url.indexOf(":")+1,currentTarget.url.length-1); + } + } + + dialogService.linkPicker({ + currentTarget: currentTarget, + callback: function (data) { + if (data) { + var href = data.url; + + function insertLink() { + if (anchorElm) { + dom.setAttribs(anchorElm, { + href: href, + title: data.name, + target: data.target ? data.target : null, + rel: data.rel ? data.rel : null + }); + + selection.select(anchorElm); + } else { + editor.execCommand('mceInsertLink', false, { + href: href, + title: data.name, + target: data.target ? data.target : null, + rel: data.rel ? data.rel : null + }); + } + } + + if (!href) { + editor.execCommand('unlink'); + return; + } + + //if we have an id, it must be a locallink:id + if(data.id){ + href = "{localLink:" + data.id + "}"; + insertLink(); + return; + } + + // Is email and not //user@domain.com + if (href.indexOf('@') > 0 && href.indexOf('//') == -1 && href.indexOf('mailto:') == -1) { + href = 'mailto:' + href; + insertLink(); + return; + } + + // Is www. prefixed + if (/^\s*www\./i.test(href)) { + href = 'http://' + href; + insertLink(); + return; + } + insertLink(); + } + } + }); + } + + editor.addButton('link', { + icon: 'link', + tooltip: 'Insert/edit link', + shortcut: 'Ctrl+K', + onclick: createLinkList(showDialog), + stateSelector: 'a[href]' + }); + + editor.addButton('unlink', { + icon: 'unlink', + tooltip: 'Remove link', + cmd: 'unlink', + stateSelector: 'a[href]' + }); + + editor.addShortcut('Ctrl+K', '', createLinkList(showDialog)); + this.showDialog = showDialog; + + editor.addMenuItem('link', { + icon: 'link', + text: 'Insert link', + shortcut: 'Ctrl+K', + onclick: createLinkList(showDialog), + stateSelector: 'a[href]', + context: 'insert', + prependToContext: true + }); +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js index 04f371fd90..cdeef6c823 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js @@ -114,6 +114,10 @@ function tinyMceService(dialogService, $log, imageHelper, $http, $timeout, macro * @param {Object} $scope the current controller scope */ createLinkPicker: function (editor, $scope) { + + + + /* editor.addButton('link', { icon: 'custom icon-link', tooltip: 'Link Picker', @@ -126,12 +130,21 @@ function tinyMceService(dialogService, $log, imageHelper, $http, $timeout, macro href: "", id: '__mcenew' }; - editor.insertContent(editor.dom.createHTML('a', data)); + + editor.execCommand("mceInsertLink", false, { + href: "wat", + title: "muh", + target: null, + "class": null + }); + + + //editor.insertContent(editor.dom.createHTML('a', data)); } } }); } - }); + });*/ }, /** diff --git a/src/Umbraco.Web.UI.Client/src/less/fonts.less b/src/Umbraco.Web.UI.Client/src/less/fonts.less index afbd83f3f8..0e74341b3e 100644 --- a/src/Umbraco.Web.UI.Client/src/less/fonts.less +++ b/src/Umbraco.Web.UI.Client/src/less/fonts.less @@ -26,4 +26,20 @@ url('../fonts/opensans/OpenSans-Semibold-webfont.svg#open_sanssemibold') format('svg'); font-weight: 600; font-style: normal; -} \ No newline at end of file +} + +.umb-abstract { + display: block; + margin-top: 0px; + margin-bottom: 15px; + font-size: 14px; + color: #b3b3b3 +} + +h5{ + text-transform: uppercase; + color: #b3b3b3; + font-weight: bold; + font-size: 13px; + margin-top: 15px; +} diff --git a/src/Umbraco.Web.UI.Client/src/less/hacks.less b/src/Umbraco.Web.UI.Client/src/less/hacks.less index 5b6f0328ed..ddbe8cb35d 100644 --- a/src/Umbraco.Web.UI.Client/src/less/hacks.less +++ b/src/Umbraco.Web.UI.Client/src/less/hacks.less @@ -6,19 +6,7 @@ /*wft ms?*/ *{ -ms-touch-action: none;} -/*we will always make sure to wrap iframe dialogs in proper padding*/ -.umbracoDialog{ - width: auto !Important; - height: auto !Important; - padding: 20px; -} -.umbracoDialog .umb-pane{margin-left: 0px; margin-right: 0px; margin-top: 0px;} -.umbracoDialog .umb-dialog-body .umb-pane{margin-left: 20px; margin-right: 20px; margin-top: 20px;} -.umbracoDialog form{height: 100%;} -/*ensures dialogs doesnt have side-by-side labels*/ -.umbracoDialog .controls-row, -.umb-modal .controls-row{margin-left: 0px !important;} .controls-row img { max-width: none; diff --git a/src/Umbraco.Web.UI.Client/src/less/main.less b/src/Umbraco.Web.UI.Client/src/less/main.less index 9c9a182039..ba4ab2b498 100644 --- a/src/Umbraco.Web.UI.Client/src/less/main.less +++ b/src/Umbraco.Web.UI.Client/src/less/main.less @@ -17,21 +17,6 @@ .umb-scrollable, .umb-auto-overflow { overflow: auto; } -.umb-abstract { - display: block; - margin-top: 0px; - margin-bottom: 15px; - font-size: 14px; - color: #b3b3b3 -} - -h5{ - text-transform: uppercase; - color: #b3b3b3; - font-weight: bold; - font-size: 13px; - margin-top: 15px; -} /* STYLES FOR SPECIFIC EDITOR COMPONENTS - for all property editors and other reusable editing components*/ @@ -121,12 +106,17 @@ div.umb-codeeditor .umb-btn-toolbar { .umb-pane { margin: 30px 20px; } - .umb-control-group { border-bottom: 1px solid @grayLighter; padding-bottom: 30px; margin-bottom: 25px !important; } +/*COMPACT MODE */ +.compact .umb-control-group { + border-bottom: 1px solid @grayLighter; + padding-bottom: 15px; + margin-bottom: 10px !important; +} .umb-pane > .umb-control-group:last-child { border: none; @@ -136,6 +126,8 @@ div.umb-codeeditor .umb-btn-toolbar { .umb-control-group .umb-el-wrap { padding: 0 } + +/* LABELS*/ .umb-control-group label.control-label { text-align: left } diff --git a/src/Umbraco.Web.UI.Client/src/less/modals.less b/src/Umbraco.Web.UI.Client/src/less/modals.less index a51c89c6cc..add7fbe542 100644 --- a/src/Umbraco.Web.UI.Client/src/less/modals.less +++ b/src/Umbraco.Web.UI.Client/src/less/modals.less @@ -98,6 +98,19 @@ bottom: 0px; } +/*we will always make sure to wrap iframe dialogs in proper padding*/ +.umbracoDialog{ + width: auto !Important; + height: auto !Important; + padding: 20px; +} +.umbracoDialog .umb-pane{margin-left: 0px; margin-right: 0px; margin-top: 0px;} +.umbracoDialog .umb-dialog-body .umb-pane{margin-left: 20px; margin-right: 20px; margin-top: 20px;} +.umbracoDialog form{height: 100%;} + +/*ensures dialogs doesnt have side-by-side labels*/ +.umbracoDialog .controls-row, +.umb-modal .controls-row{margin-left: 0px !important;} /* modal and umb-modal are used for right.hand dialogs */ .modal.fade.in{border: none !important; border-radius: none !important;} diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index a06a0d4837..b0f03c9a67 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -13,8 +13,6 @@ width: 90px; } - - .umb-modal .umb-editor { width: 95%; } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.controller.js index 03dfbe895f..f02966e029 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.controller.js @@ -6,6 +6,25 @@ angular.module("umbraco").controller("Umbraco.Dialogs.LinkPickerController", $scope.dialogTreeEventHandler = $({}); $scope.target = {}; + if(dialogOptions.currentTarget){ + $scope.target = dialogOptions.currentTarget; + + //if we a node ID, we fetch the current node to build the form data + if($scope.target.id){ + + if(!$scope.target.path){ + contentResource.getPath($scope.target.id).then(function(path){ + $scope.target.path = path; + }) + } + + contentResource.getNiceUrl($scope.target.id).then(function(url){ + $scope.target.url = angular.fromJson(url); + }); + } + } + + $scope.dialogTreeEventHandler.bind("treeNodeSelect", function(ev, args){ args.event.preventDefault(); args.event.stopPropagation(); @@ -13,32 +32,35 @@ angular.module("umbraco").controller("Umbraco.Dialogs.LinkPickerController", eventsService.publish("Umbraco.Dialogs.LinkPickerController.Select", args).then(function(args){ var c = $(args.event.target.parentElement); - //clearing - if($scope.selectedEl){ - $scope.selectedEl.find(".temporary").remove(); - $scope.selectedEl.find("i.umb-tree-icon").show(); - } - //renewing - if(c !== $scope.selectedEl){ - c.find("i.umb-tree-icon") + if(args.node !== $scope.target){ + if($scope.selectedEl){ + $scope.selectedEl.find(".temporary").remove(); + $scope.selectedEl.find("i.umb-tree-icon").show(); + } + + $scope.selectedEl = c; + $scope.target = args.node; + $scope.target.name = args.node.name; + + $scope.selectedEl.find("i.umb-tree-icon") .hide() .after(""); - $scope.selectedEl = c; - - $scope.target = args.node; - $scope.target.title = args.node.name; - if(args.node.id < 0){ $scope.target.url = "/"; }else{ - $scope.target.url = contentResource.getNiceUrl(args.node.id); + contentResource.getNiceUrl(args.node.id).then(function(url){ + $scope.target.url = angular.fromJson(url); + }); } }else{ + $scope.target = undefined; //resetting - $scope.selectedEl = null; - $scope.target = {}; + if($scope.selectedEl){ + $scope.selectedEl.find(".temporary").remove(); + $scope.selectedEl.find("i.umb-tree-icon").show(); + } } }); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html index e09ec82315..8315d7a1e2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html @@ -1,7 +1,7 @@
-