diff --git a/system/author/js/vuedraggable.umd.min.js b/system/author/js/getLevel similarity index 100% rename from system/author/js/vuedraggable.umd.min.js rename to system/author/js/getLevel diff --git a/system/typemill/Controllers/ControllerApiAuthorArticle.php b/system/typemill/Controllers/ControllerApiAuthorArticle.php new file mode 100644 index 0000000..19374a0 --- /dev/null +++ b/system/typemill/Controllers/ControllerApiAuthorArticle.php @@ -0,0 +1,335 @@ +getParsedBody(); + + # input validation + $validate = new Validation(); + $result = $validate->navigationSort($params); + if(!$result) + { + $response->getBody()->write(json_encode([ + 'message' => 'Data not valid. Please refresh the page and try again.', + 'errors' => $result + ])); + + return $response->withHeader('Content-Type', 'application/json')->withStatus(422); + } + + # set variables + $itemKeyPath = explode('.', $params['item_id']); + $parentKeyFrom = explode('.', $params['parent_id_from']); + $parentKeyTo = explode('.', $params['parent_id_to']); + $urlinfo = $this->c->get('urlinfo'); + $langattr = $this->settings['langattr']; + + # get navigation + $navigation = new Navigation(); + $draftNavigation = $navigation->getDraftNavigation($urlinfo, $langattr); + + # validate user rights + $acl = $this->c->get('acl'); + + # if user has no right to update content from others (eg admin or editor) + if(!$acl->isAllowed($request->getAttribute('c_userrole'), 'content', 'update')) + { + # check ownership. This code should nearly never run, because there is no button/interface to trigger it. + if(!$this->checkContentOwnership()) + { + $response->getBody()->write(json_encode([ + 'message' => 'You are not allowed to move that content.', + 'navigation' => $draftNavigation + ])); + + return $response->withHeader('Content-Type', 'application/json')->withStatus(422); + } + } + + $item = $navigation->getItemWithKeyPath($draftNavigation, $itemKeyPath); + + $extendedNavigation = $navigation->getExtendedNavigation($urlinfo, $langattr); + + $pageinfo = $extendedNavigation[$params['url']] ?? false; + + if(!$pageinfo) + { + $response->getBody()->write(json_encode([ + 'message' => 'page not found', + ])); + + return $response->withHeader('Content-Type', 'application/json')->withStatus(404); + } + + # if an item is moved to the first level + if($parentKeyTo == '') + { + # create empty and default values so that the logic below still works + $newFolder = new \stdClass(); + $newFolder->path = ''; + $folderContent = $draftNavigation; + } + else + { + # get the target folder from navigation + $newFolder = $navigation->getItemWithKeyPath($draftNavigation, $parentKeyTo); + + # get the content of the target folder + $folderContent = $newFolder->folderContent; + } + + # if the item has been moved within the same folder + if($parentKeyFrom == $parentKeyTo) + { + # no need to ping search engines + $ping = false; + + # get key of item + $itemKey = end($itemKeyPath); + reset($itemKeyPath); + + # delete item from folderContent + unset($folderContent[$itemKey]); + } + else + { + # let us ping search engines + $ping = true; + + # rename links in extended file + #$navigation->renameExtended($item, $newFolder); + + # an active file has been moved to another folder, so send new url with response + if($params['active'] == 'active') + { + $url = $urlinfo['baseurl'] . '/tm/content/' . $this->settings['editor'] . $newFolder->urlRelWoF . '/' . $item->slug; + } + } + + # add item to newFolder + array_splice($folderContent, $params['index_new'], 0, array($item)); + + # move and rename files in the new folder + $index = 0; + $writeError = false; + $storage = new StorageWrapper('\Typemill\Models\Storage'); + foreach($folderContent as $folderItem) + { + if(!$storage->moveFile($folderItem, $newFolder->path, $index)) + { + $writeError = true; + } + $index++; + } + if($writeError) + { + $response->getBody()->write(json_encode([ + 'message' => 'Something went wrong. Please refresh the page and check, if all folders and files are writable.', + 'navigation' => $draftNavigation, + 'url' => false + ])); + + return $response->withHeader('Content-Type', 'application/json')->withStatus(404); + } + + # if everything worked, we have to recreate the navigation + $navigation->clearNavigation(); + +/* + # get item for url and set it active again + if(isset($this->params['url'])) + { + $activeItem = Folder::getItemForUrl($this->structureDraft, $this->params['url'], $this->uri->getBaseUrl()); + } + + # update the structure for website + $this->setFreshStructureLive(); + + # update the navigation + $this->setFreshNavigation(); + + # update the sitemap + $this->updateSitemap($ping); + + # dispatch event + $this->c->dispatcher->dispatch('onPageSorted', new OnPageSorted($this->params)); +*/ + + $response->getBody()->write(json_encode([ + 'navigation' => $navigation->getDraftNavigation($urlinfo, $langattr), + 'message' => '', + 'url' => false + ])); + + return $response->withHeader('Content-Type', 'application/json'); + } + + public function createArticle(Request $request, Response $response, $args) + { + # validate user rights + $acl = $this->c->get('acl'); + + # if user has no right to update content from others (eg admin or editor) + if(!$acl->isAllowed($request->getAttribute('c_userrole'), 'mycontent', 'create')) + { + $response->getBody()->write(json_encode([ + 'message' => 'You are not allowed to create content.', + ])); + + return $response->withHeader('Content-Type', 'application/json')->withStatus(403); + } + + $params = $request->getParsedBody(); + + # input validation + $validate = new Validation(); + $result = $validate->validateNaviItem($params); + if(!$result) + { + $response->getBody()->write(json_encode([ + 'message' => 'Input not valid.', + 'errors' => $result + ])); + + return $response->withHeader('Content-Type', 'application/json')->withStatus(422); + } + + # set variables + $urlinfo = $this->c->get('urlinfo'); + $langattr = $this->settings['langattr']; + + # get navigation + $navigation = new Navigation(); + $draftNavigation = $navigation->getDraftNavigation($urlinfo, $langattr); + + if($params['folder_id'] == 'root') + { + $folderContent = $draftNavigation; + } + else + { + # get the ids (key path) for item, old folder and new folder + $folderKeyPath = explode('.', $params['folder_id']); + + # get the item from structure + $folder = $navigation->getItemWithKeyPath($draftNavigation, $folderKeyPath); + + if(!$folder) + { + $response->getBody()->write(json_encode([ + 'message' => 'We could not find this page. Please refresh and try again.' + ])); + + return $response->withHeader('Content-Type', 'application/json')->withStatus(422); + } + + $folderContent = $folder->folderContent; + } + + + + + + + $name = $params['item_name']; + $slug = Folder::createSlug($this->params['item_name'], $this->settings); + + # initialize index + $index = 0; + + # iterate through the whole content of the new folder + $writeError = false; + $folderPath = isset($folder) ? $folder->path : ''; + + foreach($folderContent as $folderItem) + { + # check, if the same name as new item, then return an error + if($folderItem->slug == $slug) + { + return $response->withJson(array('navigation' => $draftNavigation, 'errors' => 'There is already a page with this name. Please choose another name.', 'url' => $url), 404); + } + + if(!$writeYaml->moveElement($folderItem, $folderPath, $index)) + { + $writeError = true; + } + $index++; + } + + if($writeError) + { + return $response->withJson(array('data' => $this->structureDraft, 'errors' => 'Something went wrong. Please refresh the page and check, if all folders and files are writable.', 'url' => $url), 404); + } + + + + + + + # add prefix number to the name + $namePath = $index > 9 ? $index . '-' . $slug : '0' . $index . '-' . $slug; + $folderPath = 'content' . $folder->path; + + # create default content + $content = json_encode(['# ' . $name, 'Content']); + + if($this->params['type'] == 'file') + { + if(!$writeYaml->writeFile($folderPath, $namePath . '.txt', $content)) + { + return $response->withJson(array('data' => $this->structureDraft, 'errors' => 'We could not create the file. Please refresh the page and check, if all folders and files are writable.', 'url' => $url), 404); + } + } + elseif($this->params['type'] == 'folder') + { + if(!$writeYaml->checkPath($folderPath . DIRECTORY_SEPARATOR . $namePath)) + { + return $response->withJson(array('data' => $this->structureDraft, 'errors' => 'We could not create the folder. Please refresh the page and check, if all folders and files are writable.', 'url' => $url), 404); + } + $this->writeCache->writeFile($folderPath . DIRECTORY_SEPARATOR . $namePath, 'index.txt', $content); + + # always redirect to a folder + $url = $this->uri->getBaseUrl() . '/tm/content/' . $this->settings['editor'] . $folder->urlRelWoF . '/' . $slug; + + } + + # get extended structure + $extended = $writeYaml->getYaml('cache', 'structure-extended.yaml'); + + # create the url for the item + $urlWoF = $folder->urlRelWoF . '/' . $slug; +# $urlWoF = '/' . $slug; + + # add the navigation name to the item htmlspecialchars needed for french language + $extended[$urlWoF] = ['hide' => false, 'navtitle' => $name]; + + # store the extended structure + $writeYaml->updateYaml('cache', 'structure-extended.yaml', $extended); + + # update the structure for editor + $this->setFreshStructureDraft(); + + # get item for url and set it active again + if(isset($this->params['url'])) + { + $activeItem = Folder::getItemForUrl($this->structureDraft, $this->params['url'], $this->uri->getBaseUrl()); + } + + # activate this if you want to redirect after creating the page... + # $url = $this->uri->getBaseUrl() . '/tm/content/' . $this->settings['editor'] . $folder->urlRelWoF . '/' . $slug; + + return $response->withJson(array('data' => $this->structureDraft, 'errors' => false, 'url' => $url)); + } +} \ No newline at end of file diff --git a/system/typemill/Models/Navigation.php b/system/typemill/Models/Navigation.php index 8d952a9..5881ec5 100644 --- a/system/typemill/Models/Navigation.php +++ b/system/typemill/Models/Navigation.php @@ -40,6 +40,35 @@ class Navigation $this->extendedNaviName = 'navi-extended.txt'; } + public function clearNavigation(array $deleteitems = NULL ) + { + # clear cache + $this->extendedNavigation = false; + $this->draftNavigation = false; + $this->basicDraftNavigation = false; + $this->liveNavigation = false; + $this->basicLiveNavigation = false; + + # clear files + $navifiles = [ + 'extended' => $this->extendedNaviName, + 'draft' => $this->draftNaviName, + 'live' => $this->liveNaviName + ]; + + if($deleteitems) + { + $navifiles = array_intersect_key($navifiles, $deleteitems); + } + + foreach($navifiles as $navifile) + { + $result = $this->storage->deleteFile($this->naviFolder, $navifile); + } + + return $result; + } + public function getMainNavigation($userrole, $acl, $urlinfo, $editor) { $mainnavi = $this->storage->getYaml('system/typemill/settings', 'mainnavi.yaml'); @@ -76,7 +105,6 @@ class Navigation return $allowedmainnavi; } - # get the navigation with draft files for author environment public function getDraftNavigation($urlinfo, $language, $userrole = null, $username = null) { diff --git a/system/typemill/Models/Storage.php b/system/typemill/Models/Storage.php index 548efe1..2737343 100644 --- a/system/typemill/Models/Storage.php +++ b/system/typemill/Models/Storage.php @@ -192,9 +192,52 @@ class Storage return false; } - public function moveFile() + # used to sort the navigation / files + public function moveFile($item, $folderPath, $index, $date = null) { + $filetypes = array('md', 'txt', 'yaml'); + + # set new order as string + $newOrder = ($index < 10) ? '0' . $index : $index; + $newPath = $this->contentFolder . $folderPath . DIRECTORY_SEPARATOR . $newOrder . '-' . $item->slug; + + if($item->elementType == 'folder') + { + $oldPath = $this->basePath . 'content' . $item->path; + if(@rename($oldPath, $newPath)) + { + return true; + } + return false; + } + + # create old path but without filetype + $oldPath = substr($item->path, 0, strpos($item->path, ".")); + $oldPath = $this->contentFolder . $oldPath; + + $result = true; + + foreach($filetypes as $filetype) + { + $oldFilePath = $oldPath . '.' . $filetype; + $newFilePath = $newPath . '.' . $filetype; + + #check if file with filetype exists and rename + if($oldFilePath != $newFilePath && file_exists($oldFilePath)) + { + if(@rename($oldFilePath, $newFilePath)) + { + $result = $result; + } + else + { + $result = false; + } + } + } + + return $result; } /** @@ -498,54 +541,5 @@ class Storage return $result; } - public function moveElement($item, $folderPath, $index, $date = null) - { - $filetypes = array('md', 'txt', 'yaml'); - - # set new order as string - $newOrder = ($index < 10) ? '0' . $index : $index; - - # create new path with foldername or filename but without file-type - # $newPath = $this->basePath . 'content' . $folderPath . DIRECTORY_SEPARATOR . $newOrder . '-' . str_replace(" ", "-", $item->name); - - $newPath = $this->basePath . 'content' . $folderPath . DIRECTORY_SEPARATOR . $newOrder . '-' . $item->slug; - - if($item->elementType == 'folder') - { - $oldPath = $this->basePath . 'content' . $item->path; - if(@rename($oldPath, $newPath)) - { - return true; - } - return false; - } - - # create old path but without filetype - $oldPath = substr($item->path, 0, strpos($item->path, ".")); - $oldPath = $this->basePath . 'content' . $oldPath; - - $result = true; - - foreach($filetypes as $filetype) - { - $oldFilePath = $oldPath . '.' . $filetype; - $newFilePath = $newPath . '.' . $filetype; - - #check if file with filetype exists and rename - if($oldFilePath != $newFilePath && file_exists($oldFilePath)) - { - if(@rename($oldFilePath, $newFilePath)) - { - $result = $result; - } - else - { - $result = false; - } - } - } - - return $result; - } */ } \ No newline at end of file diff --git a/system/typemill/Models/Validation.php b/system/typemill/Models/Validation.php index 00d0602..503a806 100644 --- a/system/typemill/Models/Validation.php +++ b/system/typemill/Models/Validation.php @@ -382,6 +382,66 @@ class Validation return $v->errors(); } + /** + * validation for resort navigation + * + * @param array $params with form data. + * @return true or $v->errors with array of errors to use in json-response + */ + + public function navigationSort(array $params) + { + $v = new Validator($params); + + $v->rule('required', ['item_id', 'parent_id_from', 'parent_id_to']); + $v->rule('regex', 'item_id', '/^[0-9.]+$/i'); + $v->rule('regex', 'parent_id_from', '/^[a-zA-Z0-9.]+$/i'); + $v->rule('regex', 'parent_id_to', '/^[a-zA-Z0-9.]+$/i'); + $v->rule('integer', 'index_new'); + $v->rule('integer', 'index_old'); + + if($v->validate()) + { + return true; + } + + return $v->errors(); + } + + /** + * validation for new navigation items + * + * @param array $params with form data. + * @return true or $v->errors with array of errors to use in json-response + */ + + public function navigationItem(array $params) + { + $v = new Validator($params); + + $v->rule('required', ['folder_id', 'item_name', 'type', 'url']); + $v->rule('regex', 'folder_id', '/^(root)|([0-9.]+)$/i'); + $v->rule('navigation', 'item_name'); + $v->rule('lengthBetween', 'item_name', 1, 60); + $v->rule('in', 'type', ['file', 'folder']); + + if($v->validate()) + { + return true; + } + else + { + return $v->errors(); + } + } + + + + + + + + /** * validation for system settings @@ -463,80 +523,7 @@ class Validation } } - /** - * validation for resort navigation - * - * @param array $params with form data. - * @return true or $v->errors with array of errors to use in json-response - */ - - public function navigationSort(array $params) - { - $v = new Validator($params); - - $v->rule('required', ['item_id', 'parent_id_from', 'parent_id_to']); - $v->rule('regex', 'item_id', '/^[0-9.]+$/i'); - $v->rule('regex', 'parent_id_from', '/^[a-zA-Z0-9.]+$/i'); - $v->rule('regex', 'parent_id_to', '/^[a-zA-Z0-9.]+$/i'); - $v->rule('integer', 'index_new'); - - if($v->validate()) - { - return true; - } - else - { - return $v->errors(); - } - } - /** - * validation for new navigation items - * - * @param array $params with form data. - * @return true or $v->errors with array of errors to use in json-response - */ - - public function navigationItem(array $params) - { - $v = new Validator($params); - - $v->rule('required', ['folder_id', 'item_name', 'type', 'url']); - $v->rule('regex', 'folder_id', '/^[0-9.]+$/i'); -# $v->rule('noSpecialChars', 'item_name'); - $v->rule('navigation', 'item_name'); - $v->rule('lengthBetween', 'item_name', 1, 60); - $v->rule('in', 'type', ['file', 'folder']); - - if($v->validate()) - { - return true; - } - else - { - return $v->errors(); - } - } - - public function navigationBaseItem(array $params) - { - $v = new Validator($params); - - $v->rule('required', ['item_name', 'type', 'url']); -# $v->rule('noSpecialChars', 'item_name'); - $v->rule('navigation', 'item_name'); - $v->rule('lengthBetween', 'item_name', 1, 40); - $v->rule('in', 'type', ['file', 'folder']); - - if($v->validate()) - { - return true; - } - else - { - return $v->errors(); - } - } /** * validation for dynamic fields ( settings for themes and plugins) diff --git a/system/typemill/author/css/output.css b/system/typemill/author/css/output.css index daad61b..c601452 100644 --- a/system/typemill/author/css/output.css +++ b/system/typemill/author/css/output.css @@ -620,6 +620,14 @@ video { pointer-events: none; } +.visible { + visibility: visible; +} + +.invisible { + visibility: hidden; +} + .static { position: static; } @@ -636,6 +644,11 @@ video { position: relative; } +.sticky { + position: -webkit-sticky; + position: sticky; +} + .inset-0 { top: 0px; right: 0px; @@ -688,6 +701,10 @@ video { margin: auto; } +.m-1 { + margin: 0.25rem; +} + .my-2 { margin-top: 0.5rem; margin-bottom: 0.5rem; @@ -723,28 +740,45 @@ video { margin-bottom: 0.75rem; } +.mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + .mt-6 { margin-top: 1.5rem; } -.mb-1 { - margin-bottom: 0.25rem; -} - -.mt-3 { - margin-top: 0.75rem; -} - .mb-4 { margin-bottom: 1rem; } +.mr-3 { + margin-right: 0.75rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mr-4 { + margin-right: 1rem; +} + +.mt-3 { + margin-top: 0.75rem; +} + .mb-3 { margin-bottom: 0.75rem; } -.mr-3 { - margin-right: 0.75rem; +.ml-3 { + margin-left: 0.75rem; } .mt-5 { @@ -771,10 +805,6 @@ video { margin-top: 1rem; } -.mt-auto { - margin-top: auto; -} - .mt-8 { margin-top: 2rem; } @@ -783,16 +813,16 @@ video { margin-top: 1.75rem; } -.mr-4 { - margin-right: 1rem; -} - .mr-2 { margin-right: 0.5rem; } -.ml-3 { - margin-left: 0.75rem; +.ml-1 { + margin-left: 0.25rem; +} + +.-ml-1 { + margin-left: -0.25rem; } .block { @@ -839,6 +869,10 @@ video { height: 1.5rem; } +.h-0 { + height: 0px; +} + .h-12 { height: 3rem; } @@ -851,14 +885,6 @@ video { height: 20rem; } -.h-64 { - height: 16rem; -} - -.h-0 { - height: 0px; -} - .h-48 { height: 12rem; } @@ -879,6 +905,10 @@ video { width: 100%; } +.w-1\/4 { + width: 25%; +} + .w-2\/5 { width: 40%; } @@ -895,6 +925,10 @@ video { width: 1.5rem; } +.w-0 { + width: 0px; +} + .w-5 { width: 1.25rem; } @@ -931,14 +965,6 @@ video { width: 75%; } -.w-1\/4 { - width: 25%; -} - -.w-0 { - width: 0px; -} - .max-w-md { max-width: 28rem; } @@ -975,6 +1001,23 @@ video { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } +@-webkit-keyframes spin { + to { + transform: rotate(360deg); + } +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.animate-spin { + -webkit-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + .cursor-pointer { cursor: pointer; } @@ -983,10 +1026,8 @@ video { resize: both; } -.appearance-none { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; +.list-none { + list-style-type: none; } .flex-col { @@ -1025,12 +1066,6 @@ video { justify-content: space-around; } -.space-x-8 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(2rem * var(--tw-space-x-reverse)); - margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); -} - .space-x-4 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(1rem * var(--tw-space-x-reverse)); @@ -1076,10 +1111,22 @@ video { border-right-width: 8px; } +.border-l-4 { + border-left-width: 4px; +} + .border-b { border-bottom-width: 1px; } +.border-b-8 { + border-bottom-width: 8px; +} + +.border-t-8 { + border-top-width: 8px; +} + .border-b-2 { border-bottom-width: 2px; } @@ -1096,18 +1143,6 @@ video { border-right-width: 2px; } -.border-l-4 { - border-left-width: 4px; -} - -.border-b-8 { - border-bottom-width: 8px; -} - -.border-t-8 { - border-top-width: 8px; -} - .border-solid { border-style: solid; } @@ -1117,6 +1152,11 @@ video { border-color: rgb(209 213 219 / var(--tw-border-opacity)); } +.border-teal-500 { + --tw-border-opacity: 1; + border-color: rgb(20 184 166 / var(--tw-border-opacity)); +} + .border-stone-200 { --tw-border-opacity: 1; border-color: rgb(231 229 228 / var(--tw-border-opacity)); @@ -1137,11 +1177,6 @@ video { border-color: rgb(214 211 209 / var(--tw-border-opacity)); } -.border-teal-500 { - --tw-border-opacity: 1; - border-color: rgb(20 184 166 / var(--tw-border-opacity)); -} - .border-stone-700 { --tw-border-opacity: 1; border-color: rgb(68 64 60 / var(--tw-border-opacity)); @@ -1177,11 +1212,6 @@ video { border-right-color: transparent; } -.border-b-blue-600 { - --tw-border-opacity: 1; - border-bottom-color: rgb(37 99 235 / var(--tw-border-opacity)); -} - .border-b-white { --tw-border-opacity: 1; border-bottom-color: rgb(255 255 255 / var(--tw-border-opacity)); @@ -1202,16 +1232,6 @@ video { background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } -.bg-rose-500 { - --tw-bg-opacity: 1; - background-color: rgb(244 63 94 / var(--tw-bg-opacity)); -} - -.bg-teal-500 { - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); -} - .bg-stone-100 { --tw-bg-opacity: 1; background-color: rgb(245 245 244 / var(--tw-bg-opacity)); @@ -1222,16 +1242,26 @@ video { background-color: rgb(68 64 60 / var(--tw-bg-opacity)); } -.bg-red-100 { - --tw-bg-opacity: 1; - background-color: rgb(254 226 226 / var(--tw-bg-opacity)); -} - .bg-stone-200 { --tw-bg-opacity: 1; background-color: rgb(231 229 228 / var(--tw-bg-opacity)); } +.bg-rose-500 { + --tw-bg-opacity: 1; + background-color: rgb(244 63 94 / var(--tw-bg-opacity)); +} + +.bg-teal-500 { + --tw-bg-opacity: 1; + background-color: rgb(20 184 166 / var(--tw-bg-opacity)); +} + +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity)); +} + .bg-stone-900 { --tw-bg-opacity: 1; background-color: rgb(28 25 23 / var(--tw-bg-opacity)); @@ -1242,6 +1272,10 @@ video { background-color: rgb(250 250 249 / var(--tw-bg-opacity)); } +.bg-transparent { + background-color: transparent; +} + .bg-opacity-90 { --tw-bg-opacity: 0.9; } @@ -1254,6 +1288,10 @@ video { background-position: center; } +.p-1 { + padding: 0.25rem; +} + .p-2 { padding: 0.5rem; } @@ -1274,10 +1312,6 @@ video { padding: 1.5rem; } -.p-1 { - padding: 0.25rem; -} - .py-5 { padding-top: 1.25rem; padding-bottom: 1.25rem; @@ -1333,6 +1367,10 @@ video { padding-right: 0.25rem; } +.pl-2 { + padding-left: 0.5rem; +} + .pl-3 { padding-left: 0.75rem; } @@ -1361,8 +1399,8 @@ video { padding-top: 0.5rem; } -.pl-8 { - padding-left: 2rem; +.pb-4 { + padding-bottom: 1rem; } .pt-4 { @@ -1373,12 +1411,16 @@ video { padding-bottom: 0.75rem; } -.pr-8 { - padding-right: 2rem; +.pl-4 { + padding-left: 1rem; } -.pb-4 { - padding-bottom: 1rem; +.pl-8 { + padding-left: 2rem; +} + +.pl-12 { + padding-left: 3rem; } .text-left { @@ -1416,6 +1458,16 @@ video { line-height: 1rem; } +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + .text-lg { font-size: 1.125rem; line-height: 1.75rem; @@ -1426,21 +1478,11 @@ video { line-height: 1.75rem; } -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - .text-2xl { font-size: 1.5rem; line-height: 2rem; } -.text-3xl { - font-size: 1.875rem; - line-height: 2.25rem; -} - .font-normal { font-weight: 400; } @@ -1519,27 +1561,42 @@ video { color: rgb(6 182 212 / var(--tw-text-opacity)); } +.text-stone-700 { + --tw-text-opacity: 1; + color: rgb(68 64 60 / var(--tw-text-opacity)); +} + +.text-stone-200 { + --tw-text-opacity: 1; + color: rgb(231 229 228 / var(--tw-text-opacity)); +} + +.text-stone-500 { + --tw-text-opacity: 1; + color: rgb(120 113 108 / var(--tw-text-opacity)); +} + .underline { -webkit-text-decoration-line: underline; text-decoration-line: underline; } -.accent-pink-300 { - accent-color: #f9a8d4; -} - .accent-white { accent-color: #fff; } -.accent-teal-500 { - accent-color: #14b8a6; -} - .opacity-0 { opacity: 0; } +.opacity-25 { + opacity: 0.25; +} + +.opacity-75 { + opacity: 0.75; +} + .shadow-lg { --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); @@ -1598,26 +1655,6 @@ video { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } -.checked\:bg-white:checked { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.checked\:bg-blue-500:checked { - --tw-bg-opacity: 1; - background-color: rgb(59 130 246 / var(--tw-bg-opacity)); -} - -.checked\:bg-teal-500:checked { - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); -} - -.checked\:text-white:checked { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - .hover\:border-b-4:hover { border-bottom-width: 4px; } @@ -1637,11 +1674,21 @@ video { border-color: rgb(20 184 166 / var(--tw-border-opacity)); } +.hover\:border-stone-50:hover { + --tw-border-opacity: 1; + border-color: rgb(250 250 249 / var(--tw-border-opacity)); +} + .hover\:bg-gray-200:hover { --tw-bg-opacity: 1; background-color: rgb(229 231 235 / var(--tw-bg-opacity)); } +.hover\:bg-stone-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(250 250 249 / var(--tw-bg-opacity)); +} + .hover\:bg-stone-900:hover { --tw-bg-opacity: 1; background-color: rgb(28 25 23 / var(--tw-bg-opacity)); @@ -1687,9 +1734,19 @@ video { background-color: rgb(6 182 212 / var(--tw-bg-opacity)); } -.hover\:bg-stone-50:hover { +.hover\:bg-stone-700:hover { --tw-bg-opacity: 1; - background-color: rgb(250 250 249 / var(--tw-bg-opacity)); + background-color: rgb(68 64 60 / var(--tw-bg-opacity)); +} + +.hover\:bg-stone-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(120 113 108 / var(--tw-bg-opacity)); +} + +.hover\:bg-teal-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(20 184 166 / var(--tw-bg-opacity)); } .hover\:text-white:hover { @@ -1697,6 +1754,16 @@ video { color: rgb(255 255 255 / var(--tw-text-opacity)); } +.hover\:text-stone-50:hover { + --tw-text-opacity: 1; + color: rgb(250 250 249 / var(--tw-text-opacity)); +} + +.hover\:text-stone-100:hover { + --tw-text-opacity: 1; + color: rgb(245 245 244 / var(--tw-text-opacity)); +} + .hover\:underline:hover { -webkit-text-decoration-line: underline; text-decoration-line: underline; @@ -1707,6 +1774,11 @@ video { border-color: rgb(37 99 235 / var(--tw-border-opacity)); } +.focus\:border-stone-100:focus { + --tw-border-opacity: 1; + border-color: rgb(245 245 244 / var(--tw-border-opacity)); +} + .focus\:bg-white:focus { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); @@ -1717,6 +1789,11 @@ video { background-color: rgb(250 250 249 / var(--tw-bg-opacity)); } +.focus\:bg-stone-100:focus { + --tw-bg-opacity: 1; + background-color: rgb(245 245 244 / var(--tw-bg-opacity)); +} + .focus\:text-gray-700:focus { --tw-text-opacity: 1; color: rgb(55 65 81 / var(--tw-text-opacity)); @@ -1738,6 +1815,10 @@ video { background-color: rgb(250 250 249 / var(--tw-bg-opacity)); } +.group:hover .group-hover\:visible { + visibility: visible; +} + @media (prefers-color-scheme: dark) { .dark\:text-gray-400 { --tw-text-opacity: 1; diff --git a/system/typemill/author/js/sortable.min.js b/system/typemill/author/js/sortable.min.js new file mode 100644 index 0000000..eba0614 --- /dev/null +++ b/system/typemill/author/js/sortable.min.js @@ -0,0 +1,2 @@ +/*! Sortable 1.10.2 - MIT | git://github.com/SortableJS/Sortable.git */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(){return(a=Object.assign||function(t){for(var e=1;e"===e[0]&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return!1}return!1}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"===e[0]?t.parentNode===n&&h(t,e):h(t,e))||o&&t===n)return t;if(t===n)break}while(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode)}var i;return null}var f,p=/\s+/g;function k(t,e,n){if(t&&e)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(p," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(p," ")}}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||-1!==e.indexOf("webkit")||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform");o&&"none"!==o&&(n=o+" "+n)}while(!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function g(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=e.left-n&&r<=e.right+n,i=a>=e.top-n&&a<=e.bottom+n;return n&&o&&i?l=t:void 0}}),l}((t=t.touches?t.touches[0]:t).clientX,t.clientY);if(e){var n={};for(var o in t)t.hasOwnProperty(o)&&(n[o]=t[o]);n.target=n.rootEl=e,n.preventDefault=void 0,n.stopPropagation=void 0,e[j]._onDragOver(n)}}}function kt(t){z&&z.parentNode[j]._isOutsideThisEl(t.target)}function Rt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Ot(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Rt.supportPointer&&"PointerEvent"in window,emptyInsertThreshold:5};for(var o in O.initializePlugins(this,t,n),n)o in e||(e[o]=n[o]);for(var i in At(e),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&xt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?u(t,"pointerdown",this._onTapStart):(u(t,"mousedown",this._onTapStart),u(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(u(t,"dragover",this),u(t,"dragenter",this)),bt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,T())}function Xt(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||w||E?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),d&&(c=d.call(u,s,a)),c}function Yt(t){t.draggable=!1}function Bt(){Dt=!1}function Ft(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;n--;)o+=e.charCodeAt(n);return o.toString(36)}function Ht(t){return setTimeout(t,0)}function Lt(t){return clearTimeout(t)}Rt.prototype={constructor:Rt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(ht=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,z):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(function(t){St.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&St.push(o)}}(o),!z&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled||s.isContentEditable||(l=P(l,t.draggable,o,!1))&&l.animated||Z===l)){if(J=F(l),et=F(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return W({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),K("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return W({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),K("filter",n,{evt:e}),!0})))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;if(n&&!z&&n.parentNode===r){var s=X(n);if(q=r,G=(z=n).parentNode,V=z.nextSibling,Z=n,ot=a.group,rt={target:Rt.dragged=z,clientX:(e||t).clientX,clientY:(e||t).clientY},ct=rt.clientX-s.left,ut=rt.clientY-s.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,z.style["will-change"]="all",o=function(){K("delayEnded",i,{evt:t}),Rt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!c&&i.nativeDraggable&&(z.draggable=!0),i._triggerDragStart(t,e),W({sortable:i,name:"choose",originalEvent:t}),k(z,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){g(z,t.trim(),Yt)}),u(l,"dragover",Pt),u(l,"mousemove",Pt),u(l,"touchmove",Pt),u(l,"mouseup",i._onDrop),u(l,"touchend",i._onDrop),u(l,"touchcancel",i._onDrop),c&&this.nativeDraggable&&(this.options.touchStartThreshold=4,z.draggable=!0),K("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(E||w))o();else{if(Rt.eventCanceled)return void this._onDrop();u(l,"mouseup",i._disableDelayedDrag),u(l,"touchend",i._disableDelayedDrag),u(l,"touchcancel",i._disableDelayedDrag),u(l,"mousemove",i._delayedDragTouchMoveHandler),u(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&u(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)}}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){z&&Yt(z),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;d(t,"mouseup",this._disableDelayedDrag),d(t,"touchend",this._disableDelayedDrag),d(t,"touchcancel",this._disableDelayedDrag),d(t,"mousemove",this._delayedDragTouchMoveHandler),d(t,"touchmove",this._delayedDragTouchMoveHandler),d(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?u(document,"pointermove",this._onTouchMove):u(document,e?"touchmove":"mousemove",this._onTouchMove):(u(z,"dragend",this),u(q,"dragstart",this._onDragStart));try{document.selection?Ht(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){if(vt=!1,q&&z){K("dragStarted",this,{evt:e}),this.nativeDraggable&&u(document,"dragover",kt);var n=this.options;t||k(z,n.dragClass,!1),k(z,n.ghostClass,!0),Rt.active=this,t&&this._appendGhost(),W({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,Nt();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY))!==e;)e=t;if(z.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){if(e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}t=e}while(e=e.parentNode);It()}},_onTouchMove:function(t){if(rt){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=U&&v(U,!0),a=U&&r&&r.a,l=U&&r&&r.d,s=Ct&>&&b(gt),c=(i.clientX-rt.clientX+o.x)/(a||1)+(s?s[0]-Et[0]:0)/(a||1),u=(i.clientY-rt.clientY+o.y)/(l||1)+(s?s[1]-Et[1]:0)/(l||1);if(!Rt.active&&!vt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))o.right+10||t.clientX<=o.right&&t.clientY>o.bottom&&t.clientX>=o.left:t.clientX>o.right&&t.clientY>o.top||t.clientX<=o.right&&t.clientY>o.bottom+10}(n,a,this)&&!g.animated){if(g===z)return A(!1);if(g&&l===n.target&&(s=g),s&&(i=X(s)),!1!==Xt(q,l,z,o,s,i,n,!!s))return O(),l.appendChild(z),G=l,N(),A(!0)}else if(s.parentNode===l){i=X(s);var v,m,b,y=z.parentNode!==l,w=!function(t,e,n){var o=n?t.left:t.top,i=n?t.right:t.bottom,r=n?t.width:t.height,a=n?e.left:e.top,l=n?e.right:e.bottom,s=n?e.width:e.height;return o===a||i===l||o+r/2===a+s/2}(z.animated&&z.toRect||o,s.animated&&s.toRect||i,a),E=a?"top":"left",D=Y(s,"top","top")||Y(z,"top","top"),S=D?D.scrollTop:void 0;if(ht!==s&&(m=i[E],yt=!1,wt=!w&&e.invertSwap||y),0!==(v=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,u=o?n.top:n.left,d=o?n.bottom:n.right,h=!1;if(!a)if(l&&pt +
+ + +
+
+
+ Home +
+
+ + `, + data: function () { + return { + navigation: data.navigation, + isExpended: false, + expanded: [], + } + }, + mounted: function(){ + var expanded = localStorage.getItem('expanded'); + if(expanded !== null) + { + var expandedArray = expanded.split(','); + var expandedLength = expandedArray.length; + var cleanExpandedArray = []; + for(var i = 0; i < expandedLength; i++) + { + if(typeof expandedArray[i] === 'string' && expandedArray[i] != '') + { + cleanExpandedArray.push(expandedArray[i]); + } + } + this.expanded = expanded.split(','); + } + eventBus.$on('toggleFolder', this.toggleFolder); + }, + methods: { + getHomeUrl() + { + return tmaxios.defaults.baseURL + '/tm/content/visual'; + }, + toggleFolder: function(name) + { + var index = this.expanded.indexOf(name); + if (index > -1) + { + this.expanded.splice(index, 1); + // this.expandNavigation = false; + } + else + { + this.expanded.push(name); + } + localStorage.setItem("expanded", this.expanded.toString()); + }, + expandNavigation() + { + this.expanded = this.getFolderNames(this.navigation, []); + localStorage.setItem("expanded", this.expanded.toString()); + }, + collapseNavigation() + { + this.expanded = []; + localStorage.removeItem('expanded'); + }, + getFolderNames(navigation, result) + { + for (const item of navigation) + { + if (item.elementType == 'folder') + { + result.push(item.name); + this.getFolderNames(item.folderContent, result); + } + } + return result; + } + } +}); + +navigation.component('draggable', vuedraggable); + +navigation.component('navilevel',{ + template: ` + + + + `, + props: { + navigation: { + type: Array, + required: true + }, + parentId: { + default: 'root' + } + }, + data: function () { + return { + navilevel: '', + load: '?', + freeze: false, + newItem: '', + format: /[@#*()=\[\]{};:"\\|,.<>\/]/, + } + }, + computed: + { + dragOptions() + { + return { + animation: 150, + group: "file", + disabled: this.freeze, + ghostClass: "ghost", + }; + }, + + // this.value when input = v-model + // this.list when input != v-model + realValue() + { + return this.value ? this.value : this.list; + } + }, + methods: + { + getNaviClass(active, activeParent, keyPathArray) + { + var naviclass = 'pl-' + (keyPathArray.length * 2); + this.navilevel = naviclass; + if(active){ naviclass += " active" } + if(activeParent){ naviclass += " activeParent" } + + return naviclass; + }, + getUrl(segment) + { + return tmaxios.defaults.baseURL + '/tm/content/visual' + segment; + }, + callToggle(name) + { + eventBus.$emit('toggleFolder', name); + }, + isExpanded(name) + { + if(this.$root.expanded.indexOf(name) > -1) + { + return true; + } + return false; + }, + onStart(evt) + { + /* delete error messages if exist */ + // publishController.errors.message = false; + }, + checkMove(evt) + { + /* do we want to keep that restriction, no folder into folders? */ + if(evt.dragged.classList.contains('folder') && evt.from.parentNode.id != evt.to.parentNode.id) + { + console.info("moved folder to another folder"); + return false; + } + if(evt.dragged.dataset.active == 'active' && !editor.draftDisabled) + { + console.info("moved page is active, save your changes first"); + // publishController.errors.message = "Please save your changes before you move the file"; + return false; + } + return true; + }, + onEnd(evt) + { + if(evt.from.parentNode.id == evt.to.parentNode.id && evt.oldIndex == evt.newIndex) + { + return + } + this.freeze = true; + this.load = evt.item.id; + + var self = this; + +// self.errors = {title: false, content: false, message: false}; + + tmaxios.post('/api/v1/article/sort',{ + 'item_id': evt.item.id, + 'parent_id_from': evt.from.parentNode.id, + 'parent_id_to': evt.to.parentNode.id, + 'index_old': evt.oldIndex, + 'index_new': evt.newIndex, + 'active': evt.item.dataset.active, + 'url': evt.item.dataset.url, +// 'url': document.getElementById("path").value, +// 'csrf_name': document.getElementById("csrf_name").value, +// 'csrf_value': document.getElementById("csrf_value").value, + }) + .then(function (response) + { + self.load = '?'; + self.freeze = false; + + if(response.data.url) + { + window.location.replace(response.data.url); + } + if(response.data.navigation) + { + self.$root.$data.navigation = response.data.navigation; + } + }) + .catch(function (error) + { + if(error.response.data.errors.message) + { +// publishController.errors.message = error.response.data.errors; + } + }); + }, + addItem(type, parent) + { + // publishController.errors.message = false; + if(this.format.test(this.newItem) || !this.newItem || this.newItem.length > 40) + { + // publishController.errors.message = 'Special Characters are not allowed. Length between 1 and 40.'; + return; + } + + self = this; + + self.freeze = true; + // self.errors = {title: false, content: false, message: false}; + + tmaxios.post('/api/v1/article',{ + 'item_name': this.newItem, + 'folder_id': parent, + 'type': type, + // 'url': document.getElementById("path").value, + // 'csrf_name': document.getElementById("csrf_name").value, + // 'csrf_value': document.getElementById("csrf_value").value, + }) + .then(function (response) { + + self.freeze = false; + + if(response.data.url) + { + window.location.replace(response.data.url); + } + if(response.data.navigation) + { + self.items = response.data.navigation; + self.newItem = ''; + } + }) + .catch(function (error) + { +// publishController.errors.message = error.response.data.errors; + }); + }, + emitter(value) { + this.$emit("input", value); + }, + }, +}); + +navigation.mount('#contentNavigation'); + +/* + data: function () { + return { + title: "Navigation", + navigation: data.navigation, + homepage: false, + editormode: 'visual', + freeze: false, + modalWindow: false, + format: /[@#*()=\[\]{};:"\\|,.<>\/]/, + folderName: '', + showForm: false, + newItem: '', + collapse: [], + } + }, + + + + + data: function () { + return { + title: "Navigation", + items: data.navigation, + homepage: false, + editormode: 'visual', + freeze: false, + modalWindow: false, + format: /[@#*()=\[\]{};:"\\|,.<>\/]/, + folderName: '', + showForm: false, + newItem: '', + collapse: [], + } + }, + checkMove: function(evt){ +/* this.$refs.draggit[0].checkMove(evt); * + if(evt.dragged.classList.contains('folder') && evt.from.parentNode.id != evt.to.parentNode.id) + { + return false; + } + if(evt.dragged.firstChild.className == 'active' && !editor.draftDisabled) + { + publishController.errors.message = "Please save your changes before you move the file"; + return false; + } + return true; + }, + onStart: function(evt){ + this.$refs.draggit[0].onStart(evt); + }, + onEnd: function(evt){ + this.$refs.draggit[0].onEnd(evt); + }, + addFile : function(type) + { + publishController.errors.message = false; + + if(this.format.test(this.newItem) || !this.newItem || this.newItem.length > 40) + { + publishController.errors.message = 'Special Characters are not allowed. Length between 1 and 40.'; + return; + } + + self = this; + + self.freeze = true; + self.errors = {title: false, content: false, message: false}; + + myaxios.post('/api/v1/baseitem',{ + 'item_name': this.newItem, + 'type': type, + 'url': document.getElementById("path").value, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }) + .then(function (response) { + + self.freeze = false; + + if(response.data.url) + { + window.location.replace(response.data.url); + } + if(response.data.data) + { + self.items = response.data.data; + self.newItem = ''; + self.showForm = false; + } + }) + .catch(function (error) + { + publishController.errors.message = error.response.data.errors; + }); + }, + getNavi: function() + { + publishController.errors.message = false; + + var self = this; + + self.freeze = true; + self.errors = {title: false, content: false, message: false}; + + var activeItem = document.getElementById("path").value; + + var url = this.root + '/api/v1/navigation?url=' + activeItem; + var method = 'GET'; + + myaxios.get('/api/v1/navigation',{ + params: { + 'url': activeItem, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + } + }) + .then(function (response) { + + self.freeze = false; + if(response.data.data) + { + self.items = response.data.data; + self.newItem = ''; + self.homepage = response.data.homepage; + } + }) + .catch(function (error) + { + if(error.response.data.errors) + { + publishController.errors.message = error.response.data.errors; + } + }); + } + } +}) + + checkMove : function(evt) + { + if(evt.dragged.classList.contains('folder') && evt.from.parentNode.id != evt.to.parentNode.id) + { + return false; + } + if(evt.dragged.firstChild.className == 'active' && !editor.draftDisabled) + { + publishController.errors.message = "Please save your changes before you move the file"; + return false; + } + return true; + }, + onStart : function(evt) + { + /* delete error messages if exist * + publishController.errors.message = false; + }, + getUrl : function(root, url) + { + return root + '/tm/content/' + this.$root.$data.editormode + url; + }, + checkActive : function(active,parent) + { + if(active && !parent) + { + return 'active'; + } + return 'inactive'; + }, + + checkActive : function(active,parent) + { + if(active && !parent) + { + return 'active'; + } + return 'inactive'; + }, + addFile : function(type) + { + publishController.errors.message = false; + + if(this.format.test(this.newItem) || !this.newItem || this.newItem.length > 40) + { + publishController.errors.message = 'Special Characters are not allowed. Length between 1 and 40.'; + return; + } + + self = this; + + self.freeze = true; + self.errors = {title: false, content: false, message: false}; + + myaxios.post('/api/v1/baseitem',{ + 'item_name': this.newItem, + 'type': type, + 'url': document.getElementById("path").value, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }) + .then(function (response) { + + self.freeze = false; + + if(response.data.url) + { + window.location.replace(response.data.url); + } + if(response.data.data) + { + self.items = response.data.data; + self.newItem = ''; + self.showForm = false; + } + }) + .catch(function (error) + { + publishController.errors.message = error.response.data.errors; + }); + }, + + addFile : function(type) + { + publishController.errors.message = false; + + if(this.$root.$data.format.test(this.newItem) || !this.newItem || this.newItem.length > 60) + { + publishController.errors.message = 'Special Characters are not allowed. Length between 1 and 60.'; + return; + } + + var self = this; + + self.$root.$data.freeze = true; + self.errors = {title: false, content: false, message: false}; + + myaxios.post('/api/v1/article',{ + 'folder_id': this.$el.id, + 'item_name': this.newItem, + 'type': type, + 'url': document.getElementById("path").value, + 'csrf_name': document.getElementById("csrf_name").value, + 'csrf_value': document.getElementById("csrf_value").value, + }) + .then(function (response) { + + self.$root.$data.freeze = false; + + if(response.data.url) + { + window.location.replace(response.data.url); + } + if(response.data.data) + { + // evt.item.classList.remove("load"); + self.$root.$data.items = response.data.data; + self.newItem = ''; + self.showForm = false; + } + }) + .catch(function (error) + { + if(error.response.data.errors) + { + publishController.errors.message = error.response.data.errors; + } + }); + }, + } +}) + +navigation.mount('#contentNavigation'); +*/ \ No newline at end of file diff --git a/system/typemill/author/js/vuedraggable.umd.min.js b/system/typemill/author/js/vuedraggable.umd.min.js new file mode 100644 index 0000000..a422aa6 --- /dev/null +++ b/system/typemill/author/js/vuedraggable.umd.min.js @@ -0,0 +1,2 @@ +(function(t,e){"object"===typeof exports&&"object"===typeof module?module.exports=e(require("vue"),require("sortablejs")):"function"===typeof define&&define.amd?define([,"sortablejs"],e):"object"===typeof exports?exports["vuedraggable"]=e(require("vue"),require("sortablejs")):t["vuedraggable"]=e(t["Vue"],t["Sortable"])})("undefined"!==typeof self?self:this,(function(t,e){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s="fb15")}({"00ee":function(t,e,n){var r=n("b622"),o=r("toStringTag"),i={};i[o]="z",t.exports="[object z]"===String(i)},"0366":function(t,e,n){var r=n("1c0b");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},"057f":function(t,e,n){var r=n("fc6a"),o=n("241c").f,i={}.toString,c="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return o(t)}catch(e){return c.slice()}};t.exports.f=function(t){return c&&"[object Window]"==i.call(t)?a(t):o(r(t))}},"06cf":function(t,e,n){var r=n("83ab"),o=n("d1e7"),i=n("5c6c"),c=n("fc6a"),a=n("c04e"),u=n("5135"),f=n("0cfb"),s=Object.getOwnPropertyDescriptor;e.f=r?s:function(t,e){if(t=c(t),e=a(e,!0),f)try{return s(t,e)}catch(n){}if(u(t,e))return i(!o.f.call(t,e),t[e])}},"0cfb":function(t,e,n){var r=n("83ab"),o=n("d039"),i=n("cc12");t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"13d5":function(t,e,n){"use strict";var r=n("23e7"),o=n("d58f").left,i=n("a640"),c=n("ae40"),a=i("reduce"),u=c("reduce",{1:0});r({target:"Array",proto:!0,forced:!a||!u},{reduce:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},"14c3":function(t,e,n){var r=n("c6b6"),o=n("9263");t.exports=function(t,e){var n=t.exec;if("function"===typeof n){var i=n.call(t,e);if("object"!==typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},"159b":function(t,e,n){var r=n("da84"),o=n("fdbc"),i=n("17c2"),c=n("9112");for(var a in o){var u=r[a],f=u&&u.prototype;if(f&&f.forEach!==i)try{c(f,"forEach",i)}catch(s){f.forEach=i}}},"17c2":function(t,e,n){"use strict";var r=n("b727").forEach,o=n("a640"),i=n("ae40"),c=o("forEach"),a=i("forEach");t.exports=c&&a?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},"1be4":function(t,e,n){var r=n("d066");t.exports=r("document","documentElement")},"1c0b":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},"1c7e":function(t,e,n){var r=n("b622"),o=r("iterator"),i=!1;try{var c=0,a={next:function(){return{done:!!c++}},return:function(){i=!0}};a[o]=function(){return this},Array.from(a,(function(){throw 2}))}catch(u){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var r={};r[o]=function(){return{next:function(){return{done:n=!0}}}},t(r)}catch(u){}return n}},"1d80":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"1dde":function(t,e,n){var r=n("d039"),o=n("b622"),i=n("2d00"),c=o("species");t.exports=function(t){return i>=51||!r((function(){var e=[],n=e.constructor={};return n[c]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"23cb":function(t,e,n){var r=n("a691"),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},"23e7":function(t,e,n){var r=n("da84"),o=n("06cf").f,i=n("9112"),c=n("6eeb"),a=n("ce4e"),u=n("e893"),f=n("94ca");t.exports=function(t,e){var n,s,l,d,p,v,h=t.target,b=t.global,g=t.stat;if(s=b?r:g?r[h]||a(h,{}):(r[h]||{}).prototype,s)for(l in e){if(p=e[l],t.noTargetGet?(v=o(s,l),d=v&&v.value):d=s[l],n=f(b?l:h+(g?".":"#")+l,t.forced),!n&&void 0!==d){if(typeof p===typeof d)continue;u(p,d)}(t.sham||d&&d.sham)&&i(p,"sham",!0),c(s,l,p,t)}}},"241c":function(t,e,n){var r=n("ca84"),o=n("7839"),i=o.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},"25f0":function(t,e,n){"use strict";var r=n("6eeb"),o=n("825a"),i=n("d039"),c=n("ad6d"),a="toString",u=RegExp.prototype,f=u[a],s=i((function(){return"/a/b"!=f.call({source:"a",flags:"b"})})),l=f.name!=a;(s||l)&&r(RegExp.prototype,a,(function(){var t=o(this),e=String(t.source),n=t.flags,r=String(void 0===n&&t instanceof RegExp&&!("flags"in u)?c.call(t):n);return"/"+e+"/"+r}),{unsafe:!0})},"2ca0":function(t,e,n){"use strict";var r=n("23e7"),o=n("06cf").f,i=n("50c4"),c=n("5a34"),a=n("1d80"),u=n("ab13"),f=n("c430"),s="".startsWith,l=Math.min,d=u("startsWith"),p=!f&&!d&&!!function(){var t=o(String.prototype,"startsWith");return t&&!t.writable}();r({target:"String",proto:!0,forced:!p&&!d},{startsWith:function(t){var e=String(a(this));c(t);var n=i(l(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return s?s.call(e,r,n):e.slice(n,n+r.length)===r}})},"2d00":function(t,e,n){var r,o,i=n("da84"),c=n("342f"),a=i.process,u=a&&a.versions,f=u&&u.v8;f?(r=f.split("."),o=r[0]+r[1]):c&&(r=c.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=c.match(/Chrome\/(\d+)/),r&&(o=r[1]))),t.exports=o&&+o},"342f":function(t,e,n){var r=n("d066");t.exports=r("navigator","userAgent")||""},"35a1":function(t,e,n){var r=n("f5df"),o=n("3f8c"),i=n("b622"),c=i("iterator");t.exports=function(t){if(void 0!=t)return t[c]||t["@@iterator"]||o[r(t)]}},"37e8":function(t,e,n){var r=n("83ab"),o=n("9bf2"),i=n("825a"),c=n("df75");t.exports=r?Object.defineProperties:function(t,e){i(t);var n,r=c(e),a=r.length,u=0;while(a>u)o.f(t,n=r[u++],e[n]);return t}},"3bbe":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},"3ca3":function(t,e,n){"use strict";var r=n("6547").charAt,o=n("69f3"),i=n("7dd0"),c="String Iterator",a=o.set,u=o.getterFor(c);i(String,"String",(function(t){a(this,{type:c,string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},"3f8c":function(t,e){t.exports={}},4160:function(t,e,n){"use strict";var r=n("23e7"),o=n("17c2");r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},"428f":function(t,e,n){var r=n("da84");t.exports=r},"44ad":function(t,e,n){var r=n("d039"),o=n("c6b6"),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},"44d2":function(t,e,n){var r=n("b622"),o=n("7c73"),i=n("9bf2"),c=r("unscopables"),a=Array.prototype;void 0==a[c]&&i.f(a,c,{configurable:!0,value:o(null)}),t.exports=function(t){a[c][t]=!0}},"44e7":function(t,e,n){var r=n("861d"),o=n("c6b6"),i=n("b622"),c=i("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[c])?!!e:"RegExp"==o(t))}},4930:function(t,e,n){var r=n("d039");t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"4d64":function(t,e,n){var r=n("fc6a"),o=n("50c4"),i=n("23cb"),c=function(t){return function(e,n,c){var a,u=r(e),f=o(u.length),s=i(c,f);if(t&&n!=n){while(f>s)if(a=u[s++],a!=a)return!0}else for(;f>s;s++)if((t||s in u)&&u[s]===n)return t||s||0;return!t&&-1}};t.exports={includes:c(!0),indexOf:c(!1)}},"4de4":function(t,e,n){"use strict";var r=n("23e7"),o=n("b727").filter,i=n("1dde"),c=n("ae40"),a=i("filter"),u=c("filter");r({target:"Array",proto:!0,forced:!a||!u},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(t,e,n){"use strict";var r=n("0366"),o=n("7b0b"),i=n("9bdd"),c=n("e95a"),a=n("50c4"),u=n("8418"),f=n("35a1");t.exports=function(t){var e,n,s,l,d,p,v=o(t),h="function"==typeof this?this:Array,b=arguments.length,g=b>1?arguments[1]:void 0,y=void 0!==g,m=f(v),x=0;if(y&&(g=r(g,b>2?arguments[2]:void 0,2)),void 0==m||h==Array&&c(m))for(e=a(v.length),n=new h(e);e>x;x++)p=y?g(v[x],x):v[x],u(n,x,p);else for(l=m.call(v),d=l.next,n=new h;!(s=d.call(l)).done;x++)p=y?i(l,g,[s.value,x],!0):s.value,u(n,x,p);return n.length=x,n}},"4fad":function(t,e,n){var r=n("23e7"),o=n("6f53").entries;r({target:"Object",stat:!0},{entries:function(t){return o(t)}})},"50c4":function(t,e,n){var r=n("a691"),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},5135:function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},5319:function(t,e,n){"use strict";var r=n("d784"),o=n("825a"),i=n("7b0b"),c=n("50c4"),a=n("a691"),u=n("1d80"),f=n("8aa5"),s=n("14c3"),l=Math.max,d=Math.min,p=Math.floor,v=/\$([$&'`]|\d\d?|<[^>]*>)/g,h=/\$([$&'`]|\d\d?)/g,b=function(t){return void 0===t?t:String(t)};r("replace",2,(function(t,e,n,r){var g=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,y=r.REPLACE_KEEPS_$0,m=g?"$":"$0";return[function(n,r){var o=u(this),i=void 0==n?void 0:n[t];return void 0!==i?i.call(n,o,r):e.call(String(o),n,r)},function(t,r){if(!g&&y||"string"===typeof r&&-1===r.indexOf(m)){var i=n(e,t,this,r);if(i.done)return i.value}var u=o(t),p=String(this),v="function"===typeof r;v||(r=String(r));var h=u.global;if(h){var S=u.unicode;u.lastIndex=0}var O=[];while(1){var w=s(u,p);if(null===w)break;if(O.push(w),!h)break;var E=String(w[0]);""===E&&(u.lastIndex=f(p,c(u.lastIndex),S))}for(var j="",A=0,P=0;P=A&&(j+=p.slice(A,T)+k,A=T+I.length)}return j+p.slice(A)}];function x(t,n,r,o,c,a){var u=r+t.length,f=o.length,s=h;return void 0!==c&&(c=i(c),s=v),e.call(a,s,(function(e,i){var a;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return n.slice(0,r);case"'":return n.slice(u);case"<":a=c[i.slice(1,-1)];break;default:var s=+i;if(0===s)return e;if(s>f){var l=p(s/10);return 0===l?e:l<=f?void 0===o[l-1]?i.charAt(1):o[l-1]+i.charAt(1):e}a=o[s-1]}return void 0===a?"":a}))}}))},5692:function(t,e,n){var r=n("c430"),o=n("c6cd");(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56ef":function(t,e,n){var r=n("d066"),o=n("241c"),i=n("7418"),c=n("825a");t.exports=r("Reflect","ownKeys")||function(t){var e=o.f(c(t)),n=i.f;return n?e.concat(n(t)):e}},"5a34":function(t,e,n){var r=n("44e7");t.exports=function(t){if(r(t))throw TypeError("The method doesn't accept regular expressions");return t}},"5c6c":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},"5db7":function(t,e,n){"use strict";var r=n("23e7"),o=n("a2bf"),i=n("7b0b"),c=n("50c4"),a=n("1c0b"),u=n("65f0");r({target:"Array",proto:!0},{flatMap:function(t){var e,n=i(this),r=c(n.length);return a(t),e=u(n,0),e.length=o(e,n,n,r,0,1,t,arguments.length>1?arguments[1]:void 0),e}})},6547:function(t,e,n){var r=n("a691"),o=n("1d80"),i=function(t){return function(e,n){var i,c,a=String(o(e)),u=r(n),f=a.length;return u<0||u>=f?t?"":void 0:(i=a.charCodeAt(u),i<55296||i>56319||u+1===f||(c=a.charCodeAt(u+1))<56320||c>57343?t?a.charAt(u):i:t?a.slice(u,u+2):c-56320+(i-55296<<10)+65536)}};t.exports={codeAt:i(!1),charAt:i(!0)}},"65f0":function(t,e,n){var r=n("861d"),o=n("e8b5"),i=n("b622"),c=i("species");t.exports=function(t,e){var n;return o(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!o(n.prototype)?r(n)&&(n=n[c],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},"69f3":function(t,e,n){var r,o,i,c=n("7f9a"),a=n("da84"),u=n("861d"),f=n("9112"),s=n("5135"),l=n("f772"),d=n("d012"),p=a.WeakMap,v=function(t){return i(t)?o(t):r(t,{})},h=function(t){return function(e){var n;if(!u(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}};if(c){var b=new p,g=b.get,y=b.has,m=b.set;r=function(t,e){return m.call(b,t,e),e},o=function(t){return g.call(b,t)||{}},i=function(t){return y.call(b,t)}}else{var x=l("state");d[x]=!0,r=function(t,e){return f(t,x,e),e},o=function(t){return s(t,x)?t[x]:{}},i=function(t){return s(t,x)}}t.exports={set:r,get:o,has:i,enforce:v,getterFor:h}},"6eeb":function(t,e,n){var r=n("da84"),o=n("9112"),i=n("5135"),c=n("ce4e"),a=n("8925"),u=n("69f3"),f=u.get,s=u.enforce,l=String(String).split("String");(t.exports=function(t,e,n,a){var u=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,d=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof e||i(n,"name")||o(n,"name",e),s(n).source=l.join("string"==typeof e?e:"")),t!==r?(u?!d&&t[e]&&(f=!0):delete t[e],f?t[e]=n:o(t,e,n)):f?t[e]=n:c(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&f(this).source||a(this)}))},"6f53":function(t,e,n){var r=n("83ab"),o=n("df75"),i=n("fc6a"),c=n("d1e7").f,a=function(t){return function(e){var n,a=i(e),u=o(a),f=u.length,s=0,l=[];while(f>s)n=u[s++],r&&!c.call(a,n)||l.push(t?[n,a[n]]:a[n]);return l}};t.exports={entries:a(!0),values:a(!1)}},"73d9":function(t,e,n){var r=n("44d2");r("flatMap")},7418:function(t,e){e.f=Object.getOwnPropertySymbols},"746f":function(t,e,n){var r=n("428f"),o=n("5135"),i=n("e538"),c=n("9bf2").f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});o(e,t)||c(e,t,{value:i.f(t)})}},7839:function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(t,e,n){var r=n("1d80");t.exports=function(t){return Object(r(t))}},"7c73":function(t,e,n){var r,o=n("825a"),i=n("37e8"),c=n("7839"),a=n("d012"),u=n("1be4"),f=n("cc12"),s=n("f772"),l=">",d="<",p="prototype",v="script",h=s("IE_PROTO"),b=function(){},g=function(t){return d+v+l+t+d+"/"+v+l},y=function(t){t.write(g("")),t.close();var e=t.parentWindow.Object;return t=null,e},m=function(){var t,e=f("iframe"),n="java"+v+":";return e.style.display="none",u.appendChild(e),e.src=String(n),t=e.contentWindow.document,t.open(),t.write(g("document.F=Object")),t.close(),t.F},x=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}x=r?y(r):m();var t=c.length;while(t--)delete x[p][c[t]];return x()};a[h]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(b[p]=o(t),n=new b,b[p]=null,n[h]=t):n=x(),void 0===e?n:i(n,e)}},"7dd0":function(t,e,n){"use strict";var r=n("23e7"),o=n("9ed3"),i=n("e163"),c=n("d2bb"),a=n("d44e"),u=n("9112"),f=n("6eeb"),s=n("b622"),l=n("c430"),d=n("3f8c"),p=n("ae93"),v=p.IteratorPrototype,h=p.BUGGY_SAFARI_ITERATORS,b=s("iterator"),g="keys",y="values",m="entries",x=function(){return this};t.exports=function(t,e,n,s,p,S,O){o(n,e,s);var w,E,j,A=function(t){if(t===p&&C)return C;if(!h&&t in T)return T[t];switch(t){case g:return function(){return new n(this,t)};case y:return function(){return new n(this,t)};case m:return function(){return new n(this,t)}}return function(){return new n(this)}},P=e+" Iterator",I=!1,T=t.prototype,_=T[b]||T["@@iterator"]||p&&T[p],C=!h&&_||A(p),L="Array"==e&&T.entries||_;if(L&&(w=i(L.call(new t)),v!==Object.prototype&&w.next&&(l||i(w)===v||(c?c(w,v):"function"!=typeof w[b]&&u(w,b,x)),a(w,P,!0,!0),l&&(d[P]=x))),p==y&&_&&_.name!==y&&(I=!0,C=function(){return _.call(this)}),l&&!O||T[b]===C||u(T,b,C),d[e]=C,p)if(E={values:A(y),keys:S?C:A(g),entries:A(m)},O)for(j in E)(h||I||!(j in T))&&f(T,j,E[j]);else r({target:e,proto:!0,forced:h||I},E);return E}},"7f9a":function(t,e,n){var r=n("da84"),o=n("8925"),i=r.WeakMap;t.exports="function"===typeof i&&/native code/.test(o(i))},"825a":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},"83ab":function(t,e,n){var r=n("d039");t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},8418:function(t,e,n){"use strict";var r=n("c04e"),o=n("9bf2"),i=n("5c6c");t.exports=function(t,e,n){var c=r(e);c in t?o.f(t,c,i(0,n)):t[c]=n}},"861d":function(t,e){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},8875:function(t,e,n){var r,o,i;(function(n,c){o=[],r=c,i="function"===typeof r?r.apply(e,o):r,void 0===i||(t.exports=i)})("undefined"!==typeof self&&self,(function(){function t(){var e=Object.getOwnPropertyDescriptor(document,"currentScript");if(!e&&"currentScript"in document&&document.currentScript)return document.currentScript;if(e&&e.get!==t&&document.currentScript)return document.currentScript;try{throw new Error}catch(p){var n,r,o,i=/.*at [^(]*\((.*):(.+):(.+)\)$/gi,c=/@([^@]*):(\d+):(\d+)\s*$/gi,a=i.exec(p.stack)||c.exec(p.stack),u=a&&a[1]||!1,f=a&&a[2]||!1,s=document.location.href.replace(document.location.hash,""),l=document.getElementsByTagName("script");u===s&&(n=document.documentElement.outerHTML,r=new RegExp("(?:[^\\n]+?\\n){0,"+(f-2)+"}[^<]* + + + {% block javascript %}{% endblock %} diff --git a/system/typemill/author/partials/symbols.twig b/system/typemill/author/partials/symbols.twig index 054d80c..e906d86 100644 --- a/system/typemill/author/partials/symbols.twig +++ b/system/typemill/author/partials/symbols.twig @@ -177,6 +177,12 @@ + + + + + + {{ assets.renderSvg() }} diff --git a/system/typemill/routes/api.php b/system/typemill/routes/api.php index 9ca52d7..ede4891 100644 --- a/system/typemill/routes/api.php +++ b/system/typemill/routes/api.php @@ -12,6 +12,7 @@ use Typemill\Controllers\ControllerApiSystemExtensions; use Typemill\Controllers\ControllerApiSystemLicense; use Typemill\Controllers\ControllerApiSystemUsers; use Typemill\Controllers\ControllerApiImage; +use Typemill\Controllers\ControllerApiAuthorArticle; $app->group('/api/v1', function (RouteCollectorProxy $group) use ($acl) { @@ -40,6 +41,10 @@ $app->group('/api/v1', function (RouteCollectorProxy $group) use ($acl) { $group->put('/image', ControllerApiMedia::class . ':publishImage')->setName('api.image.publish'); $group->delete('/image', ControllerApiMedia::class . ':deleteImage')->setName('api.image.delete'); + # ARTICLE + $group->post('/article/sort', ControllerApiAuthorArticle::class . ':sortArticle')->setName('api.article.sort')->add(new ApiAuthorization($acl, 'content', 'view')); # author + $group->post('/article', ControllerApiAuthorArticle::class . ':createArticle')->setName('api.article.create')->add(new ApiAuthorization($acl, 'content', 'view')); # author + })->add(new ApiAuthentication()); diff --git a/system/typemill/settings/permissions.yaml b/system/typemill/settings/permissions.yaml index a897056..577a02c 100644 --- a/system/typemill/settings/permissions.yaml +++ b/system/typemill/settings/permissions.yaml @@ -6,14 +6,18 @@ member: - 'view' - 'update' - 'delete' -author: - name: author +contributor: + name: contributor inherits: member permissions: mycontent: - 'view' - 'create' - 'update' +author: + name: author + inherits: contributor + permissions: content: - 'view' editor: diff --git a/tailwind.config.js b/tailwind.config.js index 3ea2f3a..ee2910e 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -8,7 +8,8 @@ module.exports = { }, opacity: { '0': '0', - } + }, + visibility: ["group-hover"], }, }, plugins: [],