jekyll-admin 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/jekyll/commands/serve.rb +4 -2
- data/lib/jekyll-admin/file_helper.rb +6 -7
- data/lib/jekyll-admin/public/asset-manifest.json +17 -17
- data/lib/jekyll-admin/public/index.html +1 -1
- data/lib/jekyll-admin/public/{precache-manifest.64226b0470ae7a98d28d6c8a80943541.js → precache-manifest.b8687326f4466a85e0973e99340bfc98.js} +13 -13
- data/lib/jekyll-admin/public/service-worker.js +1 -1
- data/lib/jekyll-admin/public/static/css/2.b74256fb.chunk.css +2 -0
- data/lib/jekyll-admin/public/static/css/2.b74256fb.chunk.css.map +1 -0
- data/lib/jekyll-admin/public/static/css/main.913a54c0.chunk.css +5 -0
- data/lib/jekyll-admin/public/static/css/main.913a54c0.chunk.css.map +1 -0
- data/lib/jekyll-admin/public/static/js/2.08ea13e0.chunk.js +3 -0
- data/lib/jekyll-admin/public/static/js/{2.c4e847cc.chunk.js.LICENSE.txt → 2.08ea13e0.chunk.js.LICENSE.txt} +1 -3
- data/lib/jekyll-admin/public/static/js/2.08ea13e0.chunk.js.map +1 -0
- data/lib/jekyll-admin/public/static/js/main.a0831f44.chunk.js +2 -0
- data/lib/jekyll-admin/public/static/js/main.a0831f44.chunk.js.map +1 -0
- data/lib/jekyll-admin/public/static/js/{runtime-main.e35fac22.js → runtime-main.95f94e60.js} +1 -1
- data/lib/jekyll-admin/public/static/js/{runtime-main.e35fac22.js.map → runtime-main.95f94e60.js.map} +1 -1
- data/lib/jekyll-admin/server.rb +3 -2
- data/lib/jekyll-admin/version.rb +1 -1
- metadata +28 -98
- data/lib/jekyll-admin/public/static/css/2.9311179f.chunk.css +0 -2
- data/lib/jekyll-admin/public/static/css/2.9311179f.chunk.css.map +0 -1
- data/lib/jekyll-admin/public/static/css/main.51bccafc.chunk.css +0 -5
- data/lib/jekyll-admin/public/static/css/main.51bccafc.chunk.css.map +0 -1
- data/lib/jekyll-admin/public/static/js/2.c4e847cc.chunk.js +0 -3
- data/lib/jekyll-admin/public/static/js/2.c4e847cc.chunk.js.map +0 -1
- data/lib/jekyll-admin/public/static/js/main.2ce220f0.chunk.js +0 -2
- data/lib/jekyll-admin/public/static/js/main.2ce220f0.chunk.js.map +0 -1
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["utils/metadata.js","assets/images/logo-black-red.png","constants/api.js","ducks/notifications.js","utils/apiErrors.js","translations/en.js","translations/index.js","utils/fetch.js","utils/validation.js","ducks/utils.js","utils/helpers.js","ducks/config.js","constants/keyboardShortcuts.js","components/Splitter.js","components/Icon.js","components/Accordion.js","ducks/collections.js","containers/Sidebar.js","constants/index.js","containers/Header.js","containers/Notifications.js","containers/App.js","components/metadata/statics/StaticMetaSimple.js","components/metadata/statics/StaticMetaObjectItem.js","components/metadata/statics/StaticMetaObject.js","components/metadata/statics/StaticMetaArrayItem.js","components/metadata/statics/StaticMetaArray.js","components/metadata/StaticMetaButton.js","components/metadata/statics/StaticMetaField.js","components/FilePreview.js","components/Breadcrumbs.js","components/form/InputSearch.js","ducks/staticfiles.js","containers/views/StaticIndex.js","components/FilePicker.js","components/metadata/MetaTags.js","components/metadata/MetaSimple.js","components/metadata/MetaButtons.js","components/metadata/MetaObjectItem.js","components/metadata/MetaObject.js","components/metadata/MetaArrayItem.js","components/metadata/MetaArray.js","components/metadata/MetaField.js","ducks/metadata.js","ducks/siteMeta.js","containers/MetaFields.js","components/DataGUI.js","components/Editor.js","components/Errors.js","components/Button.js","containers/views/Configuration.js","components/Explorer.js","ducks/pages.js","containers/views/Pages.js","components/form/InputPath.js","components/form/InputTitle.js","utils/highlighter.js","components/MarkdownEditor.js","components/MarkdownPageBody.js","containers/views/PageEdit.js","components/CreateMarkdownPage.js","containers/views/PageNew.js","containers/views/Documents.js","containers/views/DocumentEdit.js","containers/views/DocumentNew.js","ducks/datafiles.js","containers/views/DataFiles.js","containers/views/DataFileEdit.js","containers/views/DataFileNew.js","ducks/drafts.js","containers/views/Drafts.js","containers/views/DraftEdit.js","containers/views/DraftNew.js","components/Dropzone.js","containers/views/StaticFiles.js","containers/views/NotFound.js","routes.js","ducks/index.js","store.js","index.js"],"names":["addFieldToMetadata","state","namePrefix","tmpState","cloneDeep","field","eval","undefined","_","isArray","push","new_field_count","metadata","removeFieldFromMetadata","key","length","splice","has","updateMetadataFieldKey","fieldKey","newKey","Object","keys","reduce","result","current","updateMetadataFieldValue","nameAttr","value","convertMetadataField","convertType","moveMetadataArrayItem","srcInd","targetInd","arr","injectDefaultFields","config","path","type","defaults","front_matter","content","e","metafields","each","scope","extend","values","computeFieldType","specialKeys","includes","isObject","module","exports","API","putConfigurationUrl","pagesAPIUrl","directory","pageAPIUrl","filename","draftsAPIUrl","draftAPIUrl","collectionAPIUrl","collection_name","documentAPIUrl","datafilesAPIUrl","datafileAPIUrl","staticfilesAPIUrl","staticfileAPIUrl","addNotification","title","message","level","notification","BadInputError","name","stack","Error","getDeleteMessage","getLeaveMessage","getNotFoundMessage","getOverrideMessage","getParserErrorMessage","getSuccessMessage","getErrorMessage","getUploadSuccessMessage","getUploadErrorMessage","getFetchErrorMessage","getUpdateErrorMessage","getDeleteErrorMessage","getPublishDraftMessage","draftPath","postPath","getTitleRequiredMessage","getFilenameRequiredMessage","getContentRequiredMessage","getFilenameNotValidMessage","sidebar","pages","posts","drafts","datafiles","collections","staticfiles","configuration","labels","save","label","triggeredLabel","create","delete","publish","view","upload","viewToggle","translations","en","get","url","action_success","action_failure","dispatch","fetch","credentials","then","res","json","data","catch","error","put","body","method","error_message","del","id","DATE_FILENAME_MATCHER","FILENAME_MATCHER","validatePage","validator","validations","messages","errorMessages","validationStr","list","validationArr","split","single","test","validated","filterBySearchInput","input","filter","p","toLowerCase","filterDeleted","item","relative_path","search","clearErrors","validationError","errors","toYAML","obj","isEmpty","yaml","safeDump","indent","capitalize","string","charAt","toUpperCase","substring","toTitleCase","replace","txt","substr","slugify","a","RegExp","join","toString","c","indexOf","getFilenameFromPath","lastIndexOf","getExtensionFromPath","index","preventDefault","event","trimObject","object","acc","trim","JSON","parse","Array","getDocumentTitle","splat","prefix","Boolean","computeRelativePath","sanitizeFrontMatter","omit","preparePayload","stringify","fetchConfig","putConfig","source","getState","payload","raw_content","validateConfig","onEditorChange","Splitter","className","Icon","aria-hidden","Accordion","collapsed","handleClick","setState","this","props","counter","count","icon","minHeight","children","accordionClasses","classnames","panelHeight","style","maxHeight","onClick","renderIndicator","Component","defaultProps","fetchCollections","fetchCollection","collection","fetchDocument","createDocument","date","validateDocument","generateFilenameFromTitle","putDocument","deleteDocument","slugifiedTitle","docDate","moment","format","SidebarTranslations","Sidebar","hiddens","collectionItems","map","col","i","activeClassName","to","sidebar_label","itemsCount","hiddenLinks","link","translation","splitterBefore","defaultLinks","jekyll_admin","hidden_links","visibleLinks","difference","links","collectionsPanel","renderCollections","postsPanel","draftsPanel","show_drafts","connect","bindActionCreators","Header","target","process","Notifications","elementStyles","Containers","DefaultStyle","padding","width","textAlign","Title","fontSize","color","NotificationItem","margin","borderRadius","transition","success","backgroundColor","warning","info","Dismiss","top","right","height","border","opacity","notificationSystem","refs","nextProps","position","autoDismiss","ref","notifications","App","updated","prevProps","isFetching","homepage","router","currentPathname","getCurrentLocation","pathname","concat","keyMap","keyboardShortcuts","StaticMetaSimple","fieldValue","disabled","FieldTypes","array","StaticMetaArray","StaticMetaObject","simple","StaticMetaObjectItem","CurrentComponent","items","StaticMetaArrayItem","StaticMetaButton","dropdown","toggleDropdownState","onEnableField","dropdownClasses","tabIndex","onBlur","onMouseDown","StaticMetaField","enableField","FilePreview","onClickDelete","window","confirm","file","from_theme","handleClickDelete","node","isImageFile","src","http_url","alt","nodeLink","href","rel","renderFileOverlay","extname","Breadcrumbs","base","nodes","paths","before","slice","InputSearch","handleKeyPress","searchBy","onKeyPress","placeholder","fetchStaticFiles","uploadStaticFiles","files","reader","FileReader","readAsDataURL","onloadend","encoded_content","deleteStaticFile","filterByFilename","f","StaticIndex","onClickStaticFile","modalView","renderDirectoryListingBtn","renderPreviewNode","utils","FilePicker","showModal","customStyles","overlay","zIndex","paddingTop","paddingRight","paddingLeft","openModal","shutModal","onPickItem","onPick","isOpen","contentLabel","onRequestClose","MetaTags","creators","handleKeyUp","pageTags","createTag","deleteTag","handleOnChange","tagInput","showSuggestions","autoSuggest","closeSuggestions","rectifyTag","tag","rectified","updateFieldValue","clone","tagName","pop","taginput","focus","suggestions","entry","startsWith","tags","suggests","suggestionClasses","visible","onChange","onFocus","onKeyUp","hidden","momentLocalizer","MetaSimple","handleEditableChange","handleDatepickerChange","dateStr","handleEditableBlur","imagepicker","handleLayoutChange","dateValue","Date","siteMeta","renderEditable","layouts","defaultValue","renderDatepicker","renderStaticFilePicker","renderTagsInput","renderLayoutPicker","MetaButtons","fieldTypes","fieldTypeKeys","onConvertClick","parentKey","ftype","currentType","parentType","onRemoveClick","isDefaultField","sortableHandle","renderDropdownItems","MetaObjectItem","convertField","updateFieldKey","currentValue","findDOMNode","field_key","removeField","addField","key_prefix","moveArrayItem","MetaArray","MetaObject","handleKeyBlur","handleConvertClick","handleRemoveClick","MetaArrayItem","data-id","component","options","draggable","group","pull","handle","animation","onEnd","getAttribute","newIndex","Sortable","sortableGroupDecorator","bind","MetaField","select","isInDefaultState","storeContentFields","updateTitle","updateBody","updatePath","fetchSiteMeta","MetaFields","fields","dataview","isEqual","site","staticFields","visibleKeys","metafieldsClass","datafields","defaultFieldsNotOverwritten","hasOwnProperty","newWrapper","meta","DataGUI","handleChange","slug","ext","restricted","renderPathFields","Editor","editorChanged","nextState","ace","editor","getValue","mode","theme","showGutter","showPrintMargin","highlightActiveLine","scrollMargin","Errors","iconMap","Button","active","triggered","block","thin","btnClass","iconName","iconNode","Configuration","guiView","routerWillLeave","nextLocation","fieldChanged","toggleView","handleClickSave","route","setRouteLeaveHook","keyboardHandlers","handlers","renderContentBody","withRouter","Explorer","deleteItem","params","dir","browserHistory","renderTitleCell","renderDirectoryRow","renderFileRow","newBtnLabel","typeLabel","renderRows","fetchPages","fetchPage","createPage","putPage","deletePage","Pages","InputFilename","tooltip","InputTitle","hljs","registerLanguage","require","classNames","MarkdownEditor","_replaceSelectedText","cm","headNTail","startPoint","getCursor","endPoint","text","getSelection","head","tail","replaceSelection","ch","setSelection","handleFilePick","codemirror","insertTexts","image","initialValue","destroy","onSave","opts","codeSyntaxHighlighting","toolbarIcons","action","filepicker","trigger","click","SimpleMDE","on","elementToRemove","container","querySelector","remove","display","MarkdownPageBody","staticmetafields","PageEdit","new_path","page","front_matter_defaults","document_title","CreateMarkdownPage","onClickSave","metaType","defaultFields","PageNew","Documents","doc","modified_time","documents","renderTable","entries","DocumentEdit","currentDocument","DocumentNew","fetchDataFiles","fetchDataFile","putDataFile","validateDatafile","deleteDataFile","onDataFileChanged","DataFiles","DataFileEdit","datafileChanged","datafile","data_dir","gui","filepath","inputpath","data_path","guiSupport","renderAside","currentFile","DataFileNew","fetchDrafts","fetchDraft","createDraft","putDraft","deleteDraft","publishDraft","Drafts","DraftEdit","draft","today","datedfilename","goTo","handleClickPublish","DraftNew","Dropzone","ReactDropzone","open","onDrop","onClickItem","multiple","disableClick","StaticFiles","openDropzone","dropzone","uploadedFiles","existingFiles","currentFiles","currentFilenames","cf","chain","existingUploadedFilenames","static_files","dirs","entity","renderFilePreviewRow","NotFound","combineReducers","routing","routerReducer","Math","random","uploading","configureStore","createLogger","initialState","middlewares","thunk","createStore","rootReducer","compose","applyMiddleware","store","history","syncHistoryWithStore","render","routes","from","document","getElementById"],"mappings":"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","file":"static/js/main.2ce220f0.chunk.js","sourcesContent":["import _ from 'underscore';\nimport cloneDeep from 'lodash/cloneDeep';\n\n/**\n * Returns the metadata of the state with the new empty field. If the field does\n * not exist, returns the original metadata. Does not mutate the given state.\n * @param {Object} state\n * @param {String} namePrefix\n * @return {Object} metadata\n */\nexport const addFieldToMetadata = (state, namePrefix) => {\n let tmpState = cloneDeep(state);\n let field = eval(`tmpState.${namePrefix}`);\n if (field === undefined) return tmpState.metadata;\n if (_.isArray(field)) field.push('');\n else field[`New field ${state.new_field_count}`] = '';\n return tmpState.metadata;\n};\n\n/**\n * Returns the metadata of the state with the removed key. If the field does not\n * exist, returns the original metadata. Does not mutate the given state.\n * @param {Object} state\n * @param {String} namePrefix\n * @param {String} key\n * @return {Object} metadata\n */\nexport const removeFieldFromMetadata = (state, namePrefix, key) => {\n let tmpState = cloneDeep(state);\n let field = eval(`tmpState.${namePrefix}`);\n if (field === undefined) return tmpState.metadata;\n if (_.isArray(field)) {\n if (key >= field.length) {\n return tmpState.metadata;\n }\n field.splice(key, 1);\n } else {\n if (!_.has(field, key)) {\n return tmpState.metadata;\n }\n delete field[key];\n }\n return tmpState.metadata;\n};\n\n/**\n * Returns the metadata of the state with the updated key. If the field does not\n * exist or the key already exists, returns the original metadata. Does not\n * mutate the given state.\n * @param {Object} state\n * @param {String} namePrefix\n * @param {String} fieldKey\n * @param {String} newKey\n * @return {Object} metadata\n */\nexport const updateMetadataFieldKey = (state, namePrefix, fieldKey, newKey) => {\n let tmpState = cloneDeep(state);\n let field = eval(`tmpState.${namePrefix}`);\n if (field === undefined) return tmpState.metadata;\n if (_.has(field, newKey)) return tmpState.metadata;\n field = Object.keys(field).reduce((result, current) => {\n if (current === fieldKey) result[newKey] = field[current];\n else result[current] = field[current];\n return result;\n }, {});\n eval(`tmpState.${namePrefix} = field`);\n return tmpState.metadata;\n};\n\n/**\n * Returns the metadata of the state with the updated value of given path(nameAttr).\n * If the field does not exist, creates a new field. Does not mutate the given state.\n * @param {Object} state\n * @param {String} nameAttr\n * @param {String} value\n * @return {Object} metadata\n */\nexport const updateMetadataFieldValue = (state, nameAttr, value) => {\n let tmpState = cloneDeep(state);\n eval(`tmpState.${nameAttr} = value`);\n return tmpState.metadata;\n};\n\n/**\n * Returns the metadata of the state with the converted type of given path(nameAttr).\n * If the field does not exist, returns the original metadata.\n * Does not mutate the given state.\n * @param {Object} state\n * @param {String} nameAttr\n * @param {String} convertType\n * @return {Object} metadata\n */\nexport const convertMetadataField = (state, nameAttr, convertType) => {\n let tmpState = cloneDeep(state);\n let field = eval(`tmpState.${nameAttr}`);\n if (field === undefined) return tmpState.metadata;\n if (convertType === 'array') field = [''];\n else if (convertType === 'object') {\n let key = `New field ${state.new_field_count}`;\n field = { [key]: '' };\n } else field = '';\n eval(`tmpState.${nameAttr} = field`);\n return tmpState.metadata;\n};\n\n/**\n * Returns the metadata of the state with the sorted array. Moves the array item to\n * target index, shifts the rest of them. If the given path is not an array,\n * returns the original metadata. Does not mutate the given state.\n * @param {Object} state\n * @param {String} namePrefix\n * @param {Number} srcInd\n * @param {Number} targetInd\n * @return {Object} metadata\n */\nexport const moveMetadataArrayItem = (state, namePrefix, srcInd, targetInd) => {\n let tmpState = cloneDeep(state);\n let arr = eval(`tmpState.${namePrefix}`);\n if (!_.isArray(arr)) return tmpState.metadata;\n arr.splice(targetInd, 0, arr.splice(srcInd, 1)[0]);\n return tmpState.metadata;\n};\n\n/**\n * Injects the relevant default front matter fields read from the config file into\n * the provided front matter object\n * @param {Object} config\n * @param {String} path\n * @param {String} type\n * @param {Object} front_matter\n * @return {Object} metadata\n */\nexport const injectDefaultFields = (config, path, type, front_matter = {}) => {\n let defaults;\n try {\n defaults = config.content.defaults;\n } catch (e) {\n return {};\n }\n let metafields = {};\n _.each(defaults, field => {\n const scope = field.scope;\n if (\n (!scope.type || scope.type === type) &&\n (!scope.path || scope.path === path)\n ) {\n _.extend(metafields, field.values);\n }\n });\n return _.extend(metafields, front_matter);\n};\n\n/**\n * Given a field-value and corresponding key, this utility returns\n * metadata type for the pair.\n * @param {*} value\n * @param {String} key\n * @return {String} type\n */\nexport const computeFieldType = (value, key = null) => {\n let type = 'simple';\n const specialKeys = ['tags', 'categories'];\n if (specialKeys.includes(key) && _.isArray(value)) return type;\n\n if (_.isObject(value)) type = 'object';\n if (_.isArray(value)) type = 'array';\n return type;\n};\n","module.exports = \"data:image/png;base64,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\"","export const API =\n process.env.NODE_ENV === 'production'\n ? '/_api'\n : 'http://localhost:4000/_api';\n\nexport const getSiteMetaUrl = () => `${API}/site_meta`;\n\nexport const getConfigurationUrl = () => `${API}/configuration`;\nexport const putConfigurationUrl = () => `${API}/configuration`;\n\nexport const pagesAPIUrl = (directory = '') => `${API}/pages/${directory}`;\nexport const pageAPIUrl = (directory, filename) =>\n directory\n ? `${API}/pages/${directory}/${filename}`\n : `${API}/pages/${filename}`;\n\nexport const draftsAPIUrl = (directory = '') => `${API}/drafts/${directory}`;\nexport const draftAPIUrl = (directory, filename) =>\n directory\n ? `${API}/drafts/${directory}/${filename}`\n : `${API}/drafts/${filename}`;\n\nexport const collectionsAPIUrl = () => `${API}/collections`;\nexport const collectionAPIUrl = (collection_name, directory) =>\n directory\n ? `${API}/collections/${collection_name}/entries/${directory}`\n : `${API}/collections/${collection_name}/entries`;\nexport const documentAPIUrl = (collection_name, directory, filename) =>\n directory\n ? `${API}/collections/${collection_name}/${directory}/${filename}`\n : `${API}/collections/${collection_name}/${filename}`;\n\nexport const datafilesAPIUrl = (directory = '') => `${API}/data/${directory}`;\nexport const datafileAPIUrl = (directory, filename) =>\n directory\n ? `${API}/data/${directory}/${filename}`\n : `${API}/data/${filename}`;\n\nexport const staticfilesAPIUrl = (directory = '') =>\n `${API}/static_files/${directory}`;\nexport const staticfileAPIUrl = (directory, filename) =>\n directory\n ? `${API}/static_files/${directory}/${filename}`\n : `${API}/static_files/${filename}`;\n","// Action Types\nexport const ADD_NOTIFICATION = 'ADD_NOTIFICATION';\n\n// Actions\nexport const addNotification = (title, message, level) => ({\n type: ADD_NOTIFICATION,\n notification: {\n title,\n message,\n level,\n },\n});\n\n// Reducer\nexport default function notifications(\n state = {\n notification: {},\n },\n action\n) {\n switch (action.type) {\n case ADD_NOTIFICATION:\n return {\n ...state,\n notification: action.notification,\n };\n default:\n return state;\n }\n}\n","export class BadInputError extends Error {\n constructor(message) {\n super();\n this.name = 'BadInputError';\n this.message = message || 'Bad input';\n this.stack = new Error().stack;\n }\n}\n","// inline messages\nexport const getDeleteMessage = filename =>\n `Are you sure that you want to delete \"${filename}\" ?`;\n\nexport const getLeaveMessage = () =>\n 'You have unsaved changes on this page. Are you sure you want to leave?';\n\nexport const getNotFoundMessage = type => `No ${type} found.`;\n\nexport const getOverrideMessage = filename =>\n `${filename} will be overwritten. Continue anyway?`;\n\n// notification messages\nexport const getParserErrorMessage = () => 'Parse Error';\n\nexport const getSuccessMessage = () => 'Success';\n\nexport const getErrorMessage = () => 'Error';\n\nexport const getUploadSuccessMessage = filename =>\n `${filename} uploaded successfully`;\n\nexport const getUploadErrorMessage = () => `Error occurred uploading the file.`;\n\nexport const getFetchErrorMessage = filename =>\n `Could not fetch the ${filename}`;\n\nexport const getUpdateErrorMessage = filename =>\n `Could not update the ${filename}`;\n\nexport const getDeleteErrorMessage = filename =>\n `Could not delete the ${filename}`;\n\nexport const getPublishDraftMessage = (draftPath, postPath) =>\n `'${draftPath}' will be converted to '${postPath}'`;\n\n// validation messages\nexport const getTitleRequiredMessage = () => 'The title is required.';\n\nexport const getFilenameRequiredMessage = () => 'The filename is required.';\n\nexport const getContentRequiredMessage = () => 'The content is required.';\n\nexport const getFilenameNotValidMessage = () => 'The filename is not valid.';\n\n// sidebar titles\nexport const sidebar = {\n pages: 'Pages',\n posts: 'Posts',\n drafts: 'Drafts',\n datafiles: 'Data Files',\n collections: 'Collections',\n staticfiles: 'Static Files',\n configuration: 'Configuration',\n};\n\n// button labels\nexport const labels = {\n save: {\n label: 'Save',\n triggeredLabel: 'Saved',\n },\n create: {\n label: 'Create',\n triggeredLabel: 'Created',\n },\n delete: {\n label: 'Delete',\n },\n publish: {\n label: 'Publish',\n },\n view: {\n label: 'View',\n },\n upload: {\n label: 'Upload files',\n },\n viewToggle: {\n label: 'Switch View to GUI Editor',\n triggeredLabel: 'Switch View to Raw Editor',\n },\n};\n","// TODO:\n// -------------------------------\n// import * as da from './da';\n// import * as es from './es';\n// import * as fr from './fr';\n// import * as ptBr from './ptBr';\n// import * as sv from './sv';\n\nimport * as en from './en';\n\nconst translations = en; // TODO: select language\nexport default translations;\n","import fetch from 'isomorphic-fetch';\nimport { addNotification } from '../ducks/notifications';\nimport { BadInputError } from './apiErrors';\n\nimport translations from '../translations';\nconst {\n getErrorMessage,\n getFetchErrorMessage,\n getUpdateErrorMessage,\n getDeleteErrorMessage,\n} = translations;\n\n/**\n * Fetch wrapper for GET request that dispatches actions according to the\n * request status\n * @param {String} url\n * @param {Object} action_success\n * @param {Object} action_failure\n * @return {Function} dispatch\n */\nexport const get = (url, action_success, action_failure, dispatch) => {\n return fetch(url, { credentials: 'same-origin' })\n .then(res => res.json())\n .then(data =>\n dispatch({\n type: action_success.type,\n [action_success.name]: data,\n })\n )\n .catch(error => {\n dispatch({\n type: action_failure.type,\n [action_failure.name]: error,\n });\n dispatch(\n addNotification(\n getErrorMessage(),\n getFetchErrorMessage(action_success.name),\n 'error'\n )\n );\n });\n};\n\n/**\n * Fetch wrapper for PUT request that dispatches actions according to the\n * request status\n * @param {String} url\n * @param {Object} body\n * @param {Object} action_success\n * @param {Object} action_failure\n * @return {Function} dispatch\n */\nexport const put = (url, body, action_success, action_failure, dispatch) => {\n return fetch(url, {\n method: 'PUT',\n credentials: 'same-origin',\n body,\n })\n .then(res => res.json())\n .then(data => {\n if (data.error_message) {\n throw new BadInputError(data.error_message);\n }\n dispatch({\n type: action_success.type,\n [action_success.name]: data,\n });\n })\n .catch(error => {\n dispatch({\n type: action_failure.type,\n [action_failure.name]: error,\n });\n let error_message =\n error.name === 'BadInputError'\n ? error.message\n : getUpdateErrorMessage(action_success.name);\n dispatch(addNotification(getErrorMessage(), error_message, 'error'));\n });\n};\n\n/**\n * Fetch wrapper for DELETE request that dispatches actions according to the\n * request status\n * @param {String} url\n * @param {Object} action_success\n * @param {Object} action_failure\n * @return {Function} dispatch\n */\nexport const del = (url, action_success, action_failure, dispatch) => {\n return fetch(url, {\n method: 'DELETE',\n credentials: 'same-origin',\n })\n .then(data =>\n dispatch({\n type: action_success.type,\n id: action_success.id,\n })\n )\n .catch(error => {\n dispatch({\n type: action_failure.type,\n [action_failure.name]: error,\n });\n dispatch(\n addNotification(\n getErrorMessage(),\n getDeleteErrorMessage(action_success.name),\n 'error'\n )\n );\n });\n};\n","import _ from 'underscore';\n\nimport translations from '../translations';\nconst { getTitleRequiredMessage, getFilenameNotValidMessage } = translations;\n\nconst DATE_FILENAME_MATCHER = /^(?:.+\\/)*(\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]))-(.*)(\\.[^.]+)$/;\nconst FILENAME_MATCHER = /^(.*)(\\.[^.]+)$/;\n\nconst validated = (field, single) => {\n switch (single) {\n case 'required':\n return !!field;\n case 'date':\n return DATE_FILENAME_MATCHER.test(field);\n case 'filename':\n return FILENAME_MATCHER.test(field);\n default:\n return false;\n }\n};\n\nexport const validatePage = metadata => {\n return validator(\n metadata,\n { path: 'required|filename' },\n {\n 'path.required': getTitleRequiredMessage(),\n 'path.filename': getFilenameNotValidMessage(),\n }\n );\n};\n\n/**\n * Returns error messages if the given values does not pass the provided validations.\n * @param {Object} values\n * @param {Object} validations\n * @param {Object} messages\n * @return {Array} errorMessages\n */\nexport const validator = (values, validations, messages) => {\n let errorMessages = [];\n _.each(validations, (validationStr, field, list) => {\n const validationArr = validationStr.split('|');\n _.each(validationArr, single => {\n if (!validated(values[field], single)) {\n errorMessages.push(messages[`${field}.${single}`]);\n }\n });\n });\n return errorMessages;\n};\n","// Selectors\nexport const filterBySearchInput = (list, input) => {\n if (!input) {\n return list;\n }\n return list.filter(p => p.name.toLowerCase().includes(input.toLowerCase()));\n};\n\nexport const filterDeleted = (list, id) => {\n return list.filter(item => item.relative_path !== id);\n};\n\n// Action Types\nexport const SEARCH_CONTENT = 'SEARCH_CONTENT';\nexport const CLEAR_ERRORS = 'CLEAR_ERRORS';\nexport const VALIDATION_ERROR = 'VALIDATION_ERROR';\n\n// Actions\nexport const search = input => ({\n type: SEARCH_CONTENT,\n input,\n});\n\nexport const clearErrors = () => ({\n type: CLEAR_ERRORS,\n});\n\nexport const validationError = errors => ({\n type: VALIDATION_ERROR,\n errors,\n});\n\n// Reducer\nexport default function utils(\n state = {\n input: '',\n errors: [],\n },\n action\n) {\n switch (action.type) {\n case SEARCH_CONTENT:\n return {\n ...state,\n input: action.input,\n };\n case CLEAR_ERRORS:\n return {\n ...state,\n errors: [],\n };\n case VALIDATION_ERROR:\n return {\n ...state,\n errors: action.errors,\n };\n default:\n return {\n ...state,\n input: '',\n };\n }\n}\n","import yaml from 'js-yaml';\nimport _ from 'underscore';\n\n/**\n * Converts the object into YAML string.\n * @param {Object} object\n * @return {String} yaml\n */\nexport const toYAML = obj =>\n !_.isEmpty(obj) ? yaml.safeDump(obj, { indent: 2 }) : '';\n\n/**\n * Converts the YAML string into JS object.\n * @param {String} string\n * @return {Object} obj\n */\nexport const toJSON = yamlString => (yamlString ? yaml.load(yamlString) : {});\n\n/**\n * Capitalize the given string.\n * @param {String} string\n * @return {String} string\n */\nexport const capitalize = string => {\n if (!string) return '';\n return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase();\n};\n\n/**\n * Convert the given string into title case format.\n * @param {String} string\n * @return {String} string\n */\nexport const toTitleCase = string => {\n if (!string) return '';\n return string.replace(/\\w\\S*/g, txt => {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n });\n};\n\n/**\n * Slugify the given string\n * @param {String} string\n * @return {String} string\n */\nexport const slugify = string => {\n if (!string) return '';\n const a = 'àáäâèéëêìíïîıòóöôùúüûñçşßÿœæŕśńṕẃǵğǹḿǘẍźḧ·/_,:;';\n const b = 'aaaaeeeeiiiiioooouuuuncssyoarsnpwggnmuxzh------';\n const p = new RegExp(a.split('').join('|'), 'g');\n\n return string\n .toString()\n .toLowerCase()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(p, c => b.charAt(a.indexOf(c))) // Replace special chars\n .replace(/&/g, '-') // Replace & with 'and'\n .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n .replace(/-+/g, '-') // Replace multiple - with single -\n .replace(/^-+/, '') // Trim - from start of text\n .replace(/-+$/, ''); // Trim - from end of text\n};\n\n/**\n * Returns filename from the given path\n * @param {String} path\n * @return {String} filename\n */\nexport const getFilenameFromPath = path => {\n if (!path) return '';\n return path.substring(path.lastIndexOf('/') + 1);\n};\n\n/**\n * Returns extension from the given path or filename\n * @param {String} path or filename\n * @return {String} extension or nil\n */\nexport const getExtensionFromPath = path => {\n if (!path) return '';\n const filename = getFilenameFromPath(path);\n const index = filename.lastIndexOf('.');\n\n if (index > 0) {\n return filename.substring(index + 1);\n } else {\n return '';\n }\n};\n\n/**\n * returns the uploaded static files that are being overwritten\n * @param {Array} uploadedFiles\n * @param {Array} currentFiles\n * @return {Array} filenames\n */\nexport const existingUploadedFilenames = (uploadedFiles, currentFiles) => {\n if (\n (uploadedFiles && !uploadedFiles.length) ||\n (currentFiles && !currentFiles.length)\n ) {\n return [];\n }\n const currentFilenames = _.map(currentFiles, cf =>\n getFilenameFromPath(cf.path)\n );\n return _.chain(uploadedFiles)\n .filter(file => currentFilenames.includes(file.name))\n .map(file => file.name)\n .value();\n};\n\n/**\n * Given an Event object, prevents the default event\n * from bubbling, if possible.\n * @param {Event} event\n */\nexport const preventDefault = event => {\n if (event && event.preventDefault) {\n event.preventDefault();\n }\n};\n\n/**\n * Given an object, trims every keys and values recursively.\n * @param {Object} object\n * @return {Object} trimmedObject\n */\nexport const trimObject = object => {\n if (!_.isObject(object)) return object;\n return _.keys(object).reduce((acc, key) => {\n if (typeof object[key] === 'string') {\n try {\n acc[key.trim()] = JSON.parse(object[key].trim());\n } catch (e) {\n acc[key.trim()] = object[key].trim();\n }\n } else {\n acc[key.trim()] = trimObject(object[key]);\n }\n return acc;\n }, Array.isArray(object) ? [] : {});\n};\n\n/**\n * Given a resource type and splat, returns a formatted title string.\n * Falsy values are discarded.\n * @param {String} type - Resource type.\n * @param {String} splat - Directory splat for current resource.\n * @param {String} [prefix=''] - Optional string text to be placed in front.\n * @return {String} Empty string or formatted title.\n */\nexport const getDocumentTitle = (type, splat, prefix = '') => {\n if (!type) return '';\n const label = toTitleCase(type.toString());\n return [prefix, splat, label].filter(Boolean).join(' | ');\n};\n\n/**\n * @param {String} directory - Directory splat for current resource.\n * @param {String} filename - Basename of current resource.\n * @return {String} Filename or directory splat joined to the filename.\n */\nexport const computeRelativePath = (directory, filename) => {\n return directory ? `${directory}/${filename}` : `${filename}`;\n};\n\n// omit raw_content, path and empty-value keys in metadata state from front_matter\nexport const sanitizeFrontMatter = metadata => {\n return _.omit(metadata, (value, key, object) => {\n return key === 'raw_content' || key === 'path' || value === '';\n });\n};\n\nexport const preparePayload = obj => JSON.stringify(trimObject(obj));\nexport const getFilenameFromTitle = title => `${slugify(title)}.md`;\n","import { getConfigurationUrl, putConfigurationUrl } from '../constants/api';\nimport { get, put } from '../utils/fetch';\nimport { validator } from '../utils/validation';\nimport { clearErrors, validationError } from './utils';\nimport { toYAML } from '../utils/helpers';\n\nimport translations from '../translations';\nconst { getContentRequiredMessage } = translations;\n\n// Action Types\nexport const FETCH_CONFIG_REQUEST = 'FETCH_CONFIG_REQUEST';\nexport const FETCH_CONFIG_SUCCESS = 'FETCH_CONFIG_SUCCESS';\nexport const FETCH_CONFIG_FAILURE = 'FETCH_CONFIG_FAILURE';\nexport const PUT_CONFIG_REQUEST = 'PUT_CONFIG_REQUEST';\nexport const PUT_CONFIG_SUCCESS = 'PUT_CONFIG_SUCCESS';\nexport const PUT_CONFIG_FAILURE = 'PUT_CONFIG_FAILURE';\nexport const CONFIG_EDITOR_CHANGED = 'CONFIG_EDITOR_CHANGED';\n\n// Actions\nexport const fetchConfig = () => dispatch => {\n dispatch({ type: FETCH_CONFIG_REQUEST });\n return get(\n getConfigurationUrl(),\n { type: FETCH_CONFIG_SUCCESS, name: 'config' },\n { type: FETCH_CONFIG_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const putConfig = (config, source = 'editor') => (\n dispatch,\n getState\n) => {\n let payload;\n\n if (source === 'gui') {\n config = getState().metadata.metadata;\n payload = { raw_content: toYAML(config) };\n } else {\n payload = { raw_content: config };\n }\n\n // handle errors\n const errors = validateConfig(config);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n dispatch(clearErrors());\n\n return put(\n putConfigurationUrl(),\n JSON.stringify(payload),\n { type: PUT_CONFIG_SUCCESS, name: 'config' },\n { type: PUT_CONFIG_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nconst validateConfig = config =>\n validator(\n { config },\n { config: 'required' },\n {\n 'config.required': getContentRequiredMessage(),\n }\n );\n\nexport const onEditorChange = () => ({\n type: CONFIG_EDITOR_CHANGED,\n});\n\n// Reducer\nexport default function config(\n state = {\n config: {},\n updated: false,\n editorChanged: false,\n fieldChanged: false,\n isFetching: false,\n },\n action\n) {\n switch (action.type) {\n case FETCH_CONFIG_REQUEST:\n return {\n ...state,\n isFetching: true,\n };\n case FETCH_CONFIG_SUCCESS:\n return {\n ...state,\n config: action.config,\n isFetching: false,\n };\n case FETCH_CONFIG_FAILURE:\n return {\n ...state,\n isFetching: false,\n };\n case PUT_CONFIG_SUCCESS:\n return {\n ...state,\n config: action.config,\n editorChanged: false,\n updated: true,\n };\n case PUT_CONFIG_FAILURE:\n return {\n ...state,\n editorChanged: false,\n };\n case CONFIG_EDITOR_CHANGED:\n return {\n ...state,\n editorChanged: true,\n updated: false,\n };\n default:\n return {\n ...state,\n updated: false,\n editorChanged: false,\n };\n }\n}\n","export default {\n save: 'mod+s',\n};\n","import React from 'react';\n\nconst Splitter = () => <div className=\"splitter\" />;\n\nexport default Splitter;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default function Icon({ name }) {\n return <i className={`fa fa-${name}`} aria-hidden=\"true\" />;\n}\n\nIcon.propTypes = {\n name: PropTypes.string.isRequired,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport Icon from './Icon';\n\nclass Accordion extends Component {\n state = { collapsed: true };\n\n handleClick = () => {\n this.setState(state => {\n return {\n collapsed: !state.collapsed,\n };\n });\n };\n\n renderIndicator() {\n const { counter, count } = this.props;\n const { collapsed } = this.state;\n\n if (collapsed && counter && count) {\n return <div className=\"counter\">{count}</div>;\n }\n return (\n <div className=\"chevrons\">\n <Icon name={`chevron-${collapsed ? 'down' : 'up'}`} />\n </div>\n );\n }\n\n render() {\n const { icon, label, minHeight, count, children } = this.props;\n const { collapsed } = this.state;\n const accordionClasses = classnames('accordion', { collapsed });\n\n let panelHeight = minHeight;\n if (!collapsed) {\n panelHeight = minHeight && count ? (count + 1) * minHeight : 'none';\n }\n\n return (\n <div\n className={accordionClasses}\n style={{ maxHeight: panelHeight }}\n onClick={this.handleClick}\n >\n <div className=\"accordion-label\">\n {icon && <Icon name={icon} />}\n {label}\n <div className=\"indicator\">{this.renderIndicator()}</div>\n </div>\n {children}\n </div>\n );\n }\n}\n\nAccordion.defaultProps = {\n minHeight: 50,\n};\n\nAccordion.propTypes = {\n children: PropTypes.element.isRequired,\n label: PropTypes.string.isRequired,\n minHeight: PropTypes.number,\n count: PropTypes.number,\n counter: PropTypes.bool,\n icon: PropTypes.string,\n};\n\nexport default Accordion;\n","import moment from 'moment';\nimport { clearErrors, validationError, filterDeleted } from './utils';\nimport { get, put, del } from '../utils/fetch';\nimport { validator } from '../utils/validation';\nimport {\n slugify,\n preparePayload,\n sanitizeFrontMatter,\n computeRelativePath,\n} from '../utils/helpers';\nimport {\n collectionsAPIUrl,\n collectionAPIUrl,\n documentAPIUrl,\n} from '../constants/api';\n\nimport translations from '../translations';\nconst {\n getTitleRequiredMessage,\n getFilenameRequiredMessage,\n getFilenameNotValidMessage,\n} = translations;\n\n// Action Types\nexport const FETCH_COLLECTIONS_REQUEST = 'FETCH_COLLECTIONS_REQUEST';\nexport const FETCH_COLLECTIONS_SUCCESS = 'FETCH_COLLECTIONS_SUCCESS';\nexport const FETCH_COLLECTIONS_FAILURE = 'FETCH_COLLECTIONS_FAILURE';\nexport const FETCH_COLLECTION_REQUEST = 'FETCH_COLLECTION_REQUEST';\nexport const FETCH_COLLECTION_SUCCESS = 'FETCH_COLLECTION_SUCCESS';\nexport const FETCH_COLLECTION_FAILURE = 'FETCH_COLLECTION_FAILURE';\nexport const FETCH_DOCUMENT_REQUEST = 'FETCH_DOCUMENT_REQUEST';\nexport const FETCH_DOCUMENT_SUCCESS = 'FETCH_DOCUMENT_SUCCESS';\nexport const FETCH_DOCUMENT_FAILURE = 'FETCH_DOCUMENT_FAILURE';\nexport const PUT_DOCUMENT_REQUEST = 'PUT_DOCUMENT_REQUEST';\nexport const PUT_DOCUMENT_SUCCESS = 'PUT_DOCUMENT_SUCCESS';\nexport const PUT_DOCUMENT_FAILURE = 'PUT_DOCUMENT_FAILURE';\nexport const DELETE_DOCUMENT_REQUEST = 'DELETE_DOCUMENT_REQUEST';\nexport const DELETE_DOCUMENT_SUCCESS = 'DELETE_DOCUMENT_SUCCESS';\nexport const DELETE_DOCUMENT_FAILURE = 'DELETE_DOCUMENT_FAILURE';\n\n// Actions\nexport const fetchCollections = () => dispatch => {\n dispatch({ type: FETCH_COLLECTIONS_REQUEST });\n return get(\n collectionsAPIUrl(),\n { type: FETCH_COLLECTIONS_SUCCESS, name: 'collections' },\n { type: FETCH_COLLECTIONS_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const fetchCollection = (collection, directory = '') => dispatch => {\n dispatch({ type: FETCH_COLLECTION_REQUEST });\n return get(\n collectionAPIUrl(collection, directory),\n { type: FETCH_COLLECTION_SUCCESS, name: 'entries' },\n { type: FETCH_COLLECTION_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const fetchDocument = (collection, directory, filename) => dispatch => {\n dispatch({ type: FETCH_DOCUMENT_REQUEST });\n return get(\n documentAPIUrl(collection, directory, filename),\n { type: FETCH_DOCUMENT_SUCCESS, name: 'doc' },\n { type: FETCH_DOCUMENT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const createDocument = (collection, directory) => (\n dispatch,\n getState\n) => {\n // get edited fields from metadata state\n const metadata = getState().metadata.metadata;\n let { path, raw_content, title, date } = metadata;\n // if `path` is a falsy value or if appending a slash to it equals to\n // `directory`, generate filename from `title`.\n if ((!path || `${path}/` === directory) && title) {\n path = generateFilenameFromTitle(title, collection, date);\n } else {\n // validate otherwise\n const errors = validateDocument(metadata, collection);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n }\n // clear errors\n dispatch(clearErrors());\n\n const front_matter = sanitizeFrontMatter(metadata);\n\n // send the put request\n return put(\n documentAPIUrl(collection, directory, path),\n preparePayload({ raw_content, front_matter }),\n { type: PUT_DOCUMENT_SUCCESS, name: 'doc' },\n { type: PUT_DOCUMENT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const putDocument = (collection, directory, filename) => (\n dispatch,\n getState\n) => {\n // get edited fields from metadata state\n const metadata = getState().metadata.metadata;\n let { path, raw_content, title, date } = metadata;\n // if `path` is a falsy value or if appending a slash to it equals to\n // `directory`, generate filename from `title`.\n if ((!path || `${path}/` === directory) && title) {\n path = generateFilenameFromTitle(title, collection, date);\n } else {\n // validate otherwise\n const errors = validateDocument(metadata, collection);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n }\n // clear errors\n dispatch(clearErrors());\n\n const front_matter = sanitizeFrontMatter(metadata);\n\n // add collection type prefix to relative path\n const relative_path = directory\n ? `_${collection}/${directory}/${path}`\n : `_${collection}/${path}`;\n\n // send the put request\n return put(\n documentAPIUrl(collection, directory, filename),\n preparePayload({ path: relative_path, raw_content, front_matter }),\n { type: PUT_DOCUMENT_SUCCESS, name: 'doc' },\n { type: PUT_DOCUMENT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const deleteDocument = (collection, directory, filename) => dispatch => {\n const relative_path = computeRelativePath(directory, filename);\n return del(\n documentAPIUrl(collection, directory, filename),\n { type: DELETE_DOCUMENT_SUCCESS, name: 'doc', id: relative_path },\n { type: DELETE_DOCUMENT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nconst generateFilenameFromTitle = (title, collection, date) => {\n const slugifiedTitle = slugify(title);\n if (collection === 'posts') {\n // if date is provided, use it, otherwise generate it with today's date\n const docDate = date ? date.split(' ')[0] : moment().format('YYYY-MM-DD');\n return `${docDate}-${slugifiedTitle}.md`;\n }\n return `${slugifiedTitle}.md`;\n};\n\nconst validateDocument = (metadata, collection) => {\n let validations = { title: 'required' }; // base validations\n // base messages\n let messages = {\n 'title.required': getTitleRequiredMessage(),\n 'path.required': getFilenameRequiredMessage(),\n };\n\n if (collection === 'posts') {\n validations['path'] = 'required|date';\n messages['path.date'] = getFilenameNotValidMessage();\n } else {\n validations['path'] = 'required|filename';\n messages['path.filename'] = getFilenameNotValidMessage();\n }\n return validator(metadata, validations, messages);\n};\n\n// Reducer\nexport default function collections(\n state = {\n collections: [],\n entries: [],\n currentDocument: {},\n isFetching: false,\n updated: false,\n },\n action\n) {\n switch (action.type) {\n case FETCH_COLLECTIONS_REQUEST:\n case FETCH_COLLECTION_REQUEST:\n case FETCH_DOCUMENT_REQUEST:\n return {\n ...state,\n isFetching: true,\n };\n case FETCH_COLLECTIONS_SUCCESS:\n return {\n ...state,\n collections: action.collections,\n isFetching: false,\n };\n case FETCH_COLLECTION_SUCCESS:\n return {\n ...state,\n entries: action.entries,\n isFetching: false,\n };\n case FETCH_DOCUMENT_SUCCESS:\n return {\n ...state,\n currentDocument: action.doc,\n isFetching: false,\n };\n case FETCH_COLLECTIONS_FAILURE:\n return {\n ...state,\n collections: [],\n isFetching: false,\n };\n case FETCH_COLLECTION_FAILURE:\n return {\n ...state,\n entries: [],\n isFetching: false,\n };\n case FETCH_DOCUMENT_FAILURE:\n return {\n ...state,\n currentDocument: {},\n isFetching: false,\n };\n case PUT_DOCUMENT_SUCCESS:\n return {\n ...state,\n currentDocument: action.doc,\n updated: true,\n };\n case DELETE_DOCUMENT_SUCCESS:\n return {\n ...state,\n entries: filterDeleted(state.entries, action.id),\n };\n default:\n return {\n ...state,\n updated: false,\n };\n }\n}\n\n// Selectors\nexport const filterBySearchInput = (list, input) => {\n if (!input) {\n return list;\n }\n return list.filter(f =>\n (f.title || f.name).toLowerCase().includes(input.toLowerCase())\n );\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { Link } from 'react-router';\nimport { ADMIN_PREFIX } from '../constants';\nimport Splitter from '../components/Splitter';\nimport Icon from '../components/Icon';\nimport Accordion from '../components/Accordion';\nimport { fetchCollections } from '../ducks/collections';\nimport { capitalize } from '../utils/helpers';\nimport _ from 'underscore';\n\nimport translations from '../translations';\nconst SidebarTranslations = translations.sidebar;\n\nexport class Sidebar extends Component {\n componentDidMount() {\n const { fetchCollections } = this.props;\n fetchCollections();\n }\n\n renderCollections(hiddens = []) {\n const { collections } = this.props;\n\n if (!collections.length) {\n return null;\n }\n\n const collectionItems = _.map(collections, (col, i) => {\n if (col.label !== 'posts' && !hiddens.includes(col.label)) {\n return (\n <li key={i}>\n <Link\n activeClassName=\"active\"\n to={`${ADMIN_PREFIX}/collections/${col.label}`}\n >\n <Icon name=\"book\" />\n {col.sidebar_label || capitalize(col.label)}\n </Link>\n </li>\n );\n }\n }).filter(Boolean);\n\n const itemsCount = collectionItems.length;\n if (!itemsCount) {\n return null;\n }\n\n return (\n <Accordion\n count={itemsCount}\n icon=\"briefcase\"\n label={SidebarTranslations.collections}\n counter\n >\n <ul>{collectionItems}</ul>\n </Accordion>\n );\n }\n\n render() {\n const { config } = this.props;\n\n const defaults = {\n pages: {\n icon: 'file-text',\n link: 'pages',\n translation: 'pages',\n },\n datafiles: {\n icon: 'database',\n link: 'datafiles',\n translation: 'datafiles',\n splitterBefore: true,\n },\n staticfiles: {\n icon: 'file',\n link: 'staticfiles',\n translation: 'staticfiles',\n },\n configuration: {\n icon: 'cog',\n link: 'configuration',\n translation: 'configuration',\n splitterBefore: true,\n },\n };\n\n const defaultLinks = _.keys(defaults);\n let hiddenLinks;\n\n try {\n hiddenLinks = config.jekyll_admin.hidden_links || [];\n } catch (e) {\n hiddenLinks = [];\n }\n\n const visibleLinks = _.difference(defaultLinks, hiddenLinks);\n\n const links = [];\n _.each(visibleLinks, (link, index, list) => {\n const current = defaults[link];\n if (current.splitterBefore) {\n links.push(<Splitter key={'splitter' + index} />);\n }\n links.push(\n <li key={index}>\n <Link activeClassName=\"active\" to={`${ADMIN_PREFIX}/${current.link}`}>\n <Icon name={current.icon} />\n {SidebarTranslations[current.translation]}\n </Link>\n </li>\n );\n });\n\n const collectionsPanel = this.renderCollections(hiddenLinks);\n const postsPanel = !hiddenLinks.includes('posts');\n const draftsPanel = config && config.show_drafts;\n\n return (\n <div className=\"sidebar\">\n <Link className=\"logo\" to={`${ADMIN_PREFIX}/pages`} />\n <ul className=\"routes\">\n {collectionsPanel}\n {postsPanel && (\n <li>\n <Link\n activeClassName=\"active\"\n to={`${ADMIN_PREFIX}/collections/posts`}\n >\n <Icon name=\"book\" />\n {SidebarTranslations.posts}\n </Link>\n </li>\n )}\n {draftsPanel && (\n <li>\n <Link activeClassName=\"active\" to={`${ADMIN_PREFIX}/drafts`}>\n <Icon name=\"edit\" />\n {SidebarTranslations.drafts}\n </Link>\n </li>\n )}\n {(collectionsPanel || postsPanel || draftsPanel) && <Splitter />}\n {links}\n </ul>\n </div>\n );\n }\n}\n\nSidebar.propTypes = {\n collections: PropTypes.array.isRequired,\n fetchCollections: PropTypes.func.isRequired,\n config: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n collections: state.collections.collections,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchCollections,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Sidebar);\n","export const ADMIN_PREFIX = '/admin';\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router';\nimport Icon from '../components/Icon';\n\nexport class Header extends Component {\n render() {\n const { config } = this.props;\n return (\n <div className=\"header\">\n <h3 className=\"title\">\n <Link target=\"_blank\" to={config.url || '/'}>\n <Icon name=\"home\" />\n <span>{config.title || 'You have no title!'}</span>\n </Link>\n </h3>\n <span className=\"version\">v{process.env.REACT_APP_VERSION}</span>\n </div>\n );\n }\n}\n\nHeader.propTypes = {\n config: PropTypes.object.isRequired,\n};\n\nexport default Header;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport NotificationSystem from 'react-notification-system';\n\nexport class Notifications extends Component {\n componentDidMount() {\n this.notificationSystem = this.refs.notificationSystem;\n }\n\n componentWillReceiveProps(nextProps) {\n const { notification } = nextProps;\n this.notificationSystem.addNotification({\n title: notification.title,\n message: notification.message,\n level: notification.level,\n position: 'br',\n autoDismiss: 10,\n });\n }\n\n elementStyles = {\n Containers: {\n DefaultStyle: {\n padding: 15,\n width: 360,\n textAlign: 'center',\n },\n },\n Title: {\n DefaultStyle: {\n fontSize: 21,\n color: '#fff',\n },\n },\n NotificationItem: {\n DefaultStyle: {\n margin: 0,\n padding: '9px 15px 15px',\n fontSize: 15,\n borderRadius: 0,\n transition: '0.5s ease-in-out',\n },\n success: {\n color: '#fff',\n backgroundColor: '#088217',\n },\n error: {\n color: '#fff',\n backgroundColor: '#e21414',\n },\n warning: {\n color: '#fff',\n backgroundColor: '#ebad1a',\n },\n info: {\n color: '#fff',\n backgroundColor: '#369cc7',\n },\n },\n Dismiss: {\n DefaultStyle: {\n top: 7,\n right: 9,\n width: 25,\n height: 25,\n padding: 4,\n backgroundColor: 'transparent',\n border: '2px solid',\n opacity: '0.84',\n },\n },\n };\n\n render() {\n return (\n <NotificationSystem ref=\"notificationSystem\" style={this.elementStyles} />\n );\n }\n}\n\nNotifications.propTypes = {\n notification: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n notification: state.notifications.notification,\n});\n\nexport default connect(mapStateToProps)(Notifications);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { HotKeys } from 'react-hotkeys';\nimport DocumentTitle from 'react-document-title';\n\nimport { fetchConfig } from '../ducks/config';\nimport keyboardShortcuts from '../constants/keyboardShortcuts';\nimport { ADMIN_PREFIX } from '../constants';\n\n// Components\nimport Sidebar from './Sidebar';\nimport Header from './Header';\nimport Notifications from './Notifications';\n\nclass App extends Component {\n componentDidMount() {\n const { fetchConfig } = this.props;\n fetchConfig();\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.updated !== nextProps.updated) {\n const { fetchConfig } = this.props;\n fetchConfig();\n }\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.isFetching && !this.props.isFetching) {\n const {\n config: {\n content: {\n jekyll_admin: { homepage },\n collections,\n },\n },\n router,\n } = this.props;\n\n const currentPathname = router.getCurrentLocation().pathname;\n\n if (homepage && currentPathname === ADMIN_PREFIX) {\n let url = `${ADMIN_PREFIX}/pages`;\n\n const collectionNames = Object.keys(collections).concat('posts');\n if (collectionNames.includes(homepage)) {\n url = `${ADMIN_PREFIX}/collections/${homepage}`;\n }\n\n if (\n ['drafts', 'datafiles', 'staticfiles', 'configuration'].includes(\n homepage\n )\n ) {\n url = `${ADMIN_PREFIX}/${homepage}`;\n }\n\n router.replace(url);\n }\n }\n }\n\n render() {\n const { config, isFetching } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n return (\n <DocumentTitle title=\"Jekyll Admin\">\n <HotKeys keyMap={keyboardShortcuts} className=\"wrapper\">\n {config.content && (\n <div>\n <Sidebar config={config.content} />\n <div className=\"container\">\n <Header config={config.content} />\n <div className=\"content\">{this.props.children}</div>\n </div>\n <Notifications />\n </div>\n )}\n </HotKeys>\n </DocumentTitle>\n );\n }\n}\n\nApp.propTypes = {\n children: PropTypes.element,\n fetchConfig: PropTypes.func.isRequired,\n config: PropTypes.object.isRequired,\n isFetching: PropTypes.bool.isRequired,\n updated: PropTypes.bool,\n};\n\nconst mapStateToProps = state => ({\n config: state.config.config,\n updated: state.config.updated,\n isFetching: state.config.isFetching,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators({ fetchConfig }, dispatch);\n\nexport default connect(mapStateToProps, mapDispatchToProps)(App);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport TextareaAutosize from 'react-textarea-autosize';\n\nexport default function StaticMetaSimple({ fieldValue }) {\n return (\n <div className=\"meta-value\">\n <TextareaAutosize\n className=\"field value-field\"\n value={`${fieldValue}`}\n disabled\n />\n </div>\n );\n}\n\nStaticMetaSimple.propTypes = {\n fieldValue: PropTypes.any.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StaticMetaArray from './StaticMetaArray';\nimport StaticMetaObject from './StaticMetaObject';\nimport StaticMetaSimple from './StaticMetaSimple';\n\nconst FieldTypes = {\n array: StaticMetaArray,\n object: StaticMetaObject,\n simple: StaticMetaSimple,\n};\n\nexport default function StaticMetaObjectItem({ type, fieldKey, fieldValue }) {\n const CurrentComponent = FieldTypes[type];\n\n return (\n <div className=\"object-item-wrap\">\n <div className={`object-key ${type}`}>\n <input\n value={fieldKey}\n className=\"field key-field\"\n type=\"text\"\n disabled\n />\n </div>\n <div className=\"object-value\">\n <CurrentComponent fieldValue={fieldValue} />\n </div>\n </div>\n );\n}\n\nStaticMetaObjectItem.propTypes = {\n type: PropTypes.string.isRequired,\n fieldKey: PropTypes.string.isRequired,\n fieldValue: PropTypes.any.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'underscore';\nimport StaticMetaObjectItem from './StaticMetaObjectItem';\nimport { computeFieldType } from '../../../utils/metadata';\n\nexport default function StaticMetaObject({ fieldValue }) {\n const items = _.map(fieldValue, (value, key) => {\n const type = computeFieldType(value);\n return (\n <StaticMetaObjectItem\n key={key}\n fieldKey={key}\n fieldValue={value}\n type={type}\n />\n );\n });\n\n return <div className=\"meta-value-object\">{items}</div>;\n}\n\nStaticMetaObject.propTypes = {\n fieldValue: PropTypes.any.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StaticMetaArray from './StaticMetaArray';\nimport StaticMetaObject from './StaticMetaObject';\nimport StaticMetaSimple from './StaticMetaSimple';\n\nconst FieldTypes = {\n array: StaticMetaArray,\n object: StaticMetaObject,\n simple: StaticMetaSimple,\n};\n\nexport default function StaticMetaArrayItem({ type, fieldValue, index }) {\n const CurrentComponent = FieldTypes[type];\n\n return (\n <div className=\"array-item-wrap\">\n <div className=\"array\">\n <div className=\"array-header\">\n <span className=\"array-field-num\">{index + 1}.</span>\n </div>\n <CurrentComponent fieldValue={fieldValue} />\n </div>\n </div>\n );\n}\n\nStaticMetaArrayItem.propTypes = {\n type: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n fieldValue: PropTypes.any.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StaticMetaArrayItem from './StaticMetaArrayItem';\nimport { computeFieldType } from '../../../utils/metadata';\n\nexport default function StaticMetaArray({ fieldValue }) {\n const items = fieldValue.map((item, i) => {\n const type = computeFieldType(item);\n return (\n <StaticMetaArrayItem key={i} index={i} fieldValue={item} type={type} />\n );\n });\n return <div className=\"meta-value-array\">{items}</div>;\n}\n\nStaticMetaArray.propTypes = {\n fieldValue: PropTypes.any.isRequired,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Icon from '../Icon';\nimport classnames from 'classnames';\n\nexport default class StaticMetaButton extends Component {\n state = {\n dropdown: false,\n };\n\n toggleDropdownState = () => {\n this.setState(state => ({ dropdown: !state.dropdown }));\n };\n\n render() {\n const { onEnableField } = this.props;\n\n const dropdownClasses = classnames('dropdown', {\n 'showing-dropdown': this.state.dropdown,\n });\n\n return (\n <div className=\"meta-buttons\">\n <span className={dropdownClasses}>\n <a\n className=\"meta-button\"\n tabIndex=\"1\"\n onClick={this.toggleDropdownState}\n onBlur={() => this.setState({ dropdown: false })}\n >\n <Icon name=\"chevron-down\" />\n </a>\n <div className=\"dropdown-wrap\">\n <span onMouseDown={() => onEnableField()}>\n <Icon name=\"pencil\" /> Override default\n </span>\n </div>\n </span>\n </div>\n );\n }\n}\n\nStaticMetaButton.propTypes = {\n onEnableField: PropTypes.func.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StaticMetaArray from './StaticMetaArray';\nimport StaticMetaObject from './StaticMetaObject';\nimport StaticMetaSimple from './StaticMetaSimple';\nimport StaticMetaButton from '../StaticMetaButton';\n\nconst FieldTypes = {\n array: StaticMetaArray,\n object: StaticMetaObject,\n simple: StaticMetaSimple,\n};\n\nexport default function StaticMetaField({\n type,\n fieldKey,\n fieldValue,\n enableField,\n}) {\n const CurrentComponent = FieldTypes[type];\n\n return (\n <div className=\"metafield default-field\">\n <div className={`meta-key ${type}`}>\n <input\n value={fieldKey}\n className=\"field key-field\"\n type=\"text\"\n disabled\n />\n <StaticMetaButton\n onEnableField={() => {\n enableField(`metadata['${fieldKey}']`, fieldValue);\n }}\n />\n </div>\n <CurrentComponent fieldValue={fieldValue} />\n </div>\n );\n}\n\nStaticMetaField.propTypes = {\n type: PropTypes.string.isRequired,\n fieldKey: PropTypes.string.isRequired,\n fieldValue: PropTypes.any.isRequired,\n enableField: PropTypes.func.isRequired,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { getFilenameFromPath } from '../utils/helpers';\nimport Icon from './Icon';\n\nimport translations from '../translations';\nconst { getDeleteMessage } = translations;\n\nexport default class FilePreview extends Component {\n handleClickDelete(path) {\n const { splat, onClickDelete } = this.props;\n const filename = getFilenameFromPath(path);\n const confirm = window.confirm(getDeleteMessage(path));\n confirm && onClickDelete(splat, filename);\n }\n\n renderFileOverlay(file, splat) {\n if (file.from_theme) {\n return (\n <span className=\"theme-indicator\" title=\"Theme Asset\">\n <Icon name=\"diamond\" />\n </span>\n );\n } else if (splat !== 'index') {\n return (\n <button\n onClick={() => this.handleClickDelete(file.relative_path)}\n className=\"delete\"\n title=\"Delete file\"\n >\n x\n </button>\n );\n }\n }\n\n get isImageFile() {\n const {\n file: { type, extname },\n } = this.props;\n if (type === 'directory') {\n return false;\n }\n\n return /png|jpg|gif|jpeg|svg|ico/i.test(extname.substring(1));\n }\n\n render() {\n const { onClick, file, splat } = this.props;\n const node = this.isImageFile ? (\n <img src={file.http_url} alt={file.relative_path} />\n ) : (\n <div>\n <Icon name=\"file-text-o\" />\n </div>\n );\n\n const nodeLink = onClick ? (\n <a onClick={() => onClick(file.relative_path)}>{node}</a>\n ) : (\n <a href={file.http_url} target=\"_blank\" rel=\"noopener noreferrer\">\n {node}\n </a>\n );\n\n const filename = splat === 'index' ? file.relative_path : file.name;\n\n return (\n <div className=\"file-preview\">\n {this.renderFileOverlay(file, splat)}\n {nodeLink}\n <span className=\"filename\">{filename}</span>\n </div>\n );\n }\n}\n\nFilePreview.propTypes = {\n file: PropTypes.object.isRequired,\n splat: PropTypes.string.isRequired,\n onClickDelete: PropTypes.func,\n onClick: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router';\nimport { toTitleCase } from '../utils/helpers';\nimport { ADMIN_PREFIX } from '../constants';\n\nexport default function Breadcrumbs({ type, splat = '' }) {\n const nonCollectionTypes = ['pages', 'datafiles', 'drafts', 'staticfiles'];\n const base = nonCollectionTypes.includes(type)\n ? `${ADMIN_PREFIX}/${type}`\n : `${ADMIN_PREFIX}/collections/${type}`;\n\n let label = type;\n if (type === 'datafiles') {\n label = 'data files';\n } else if (type === 'staticfiles') {\n label = 'static files';\n }\n\n let nodes = [];\n if (splat) {\n const paths = splat.split('/');\n nodes = paths.map((path, i) => {\n const before = i === 0 ? '' : paths.slice(0, i).join('/') + '/';\n return (\n <li key={i}>\n <Link to={`${base}/${before}${path}`}>{path}</Link>\n </li>\n );\n });\n }\n\n return (\n <ul className=\"breadcrumbs\">\n <li>\n <Link to={base}>{toTitleCase(label)}</Link>\n </li>\n {nodes}\n </ul>\n );\n}\n\nBreadcrumbs.propTypes = {\n type: PropTypes.string.isRequired,\n splat: PropTypes.string,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class InputSearch extends Component {\n handleKeyPress = event => {\n const { search } = this.props;\n search(event.target.value);\n };\n\n render() {\n const { searchBy } = this.props;\n return (\n <input\n onKeyPress={this.handleKeyPress}\n type=\"text\"\n className=\"field\"\n placeholder={`Search by ${searchBy}`}\n />\n );\n }\n}\n\nInputSearch.propTypes = {\n search: PropTypes.func.isRequired,\n searchBy: PropTypes.string.isRequired,\n};\n","import _ from 'underscore';\nimport { filterDeleted } from './utils';\nimport { get, del } from '../utils/fetch';\nimport { computeRelativePath } from '../utils/helpers';\nimport { addNotification } from './notifications';\nimport { staticfilesAPIUrl, staticfileAPIUrl } from '../constants/api';\n\nimport translations from '../translations';\nconst {\n getSuccessMessage,\n getErrorMessage,\n getUploadSuccessMessage,\n getUploadErrorMessage,\n} = translations;\n\n// Action Types\nexport const FETCH_STATICFILES_REQUEST = 'FETCH_STATICFILES_REQUEST';\nexport const FETCH_STATICFILES_SUCCESS = 'FETCH_STATICFILES_SUCCESS';\nexport const FETCH_STATICFILES_FAILURE = 'FETCH_STATICFILES_FAILURE';\nexport const FETCH_STATICFILE_REQUEST = 'FETCH_STATICFILE_REQUEST';\nexport const FETCH_STATICFILE_SUCCESS = 'FETCH_STATICFILE_SUCCESS';\nexport const FETCH_STATICFILE_FAILURE = 'FETCH_STATICFILE_FAILURE';\nexport const PUT_STATICFILE_REQUEST = 'PUT_STATICFILE_REQUEST';\nexport const PUT_STATICFILE_SUCCESS = 'PUT_STATICFILE_SUCCESS';\nexport const PUT_STATICFILE_FAILURE = 'PUT_STATICFILE_FAILURE';\nexport const DELETE_STATICFILE_REQUEST = 'DELETE_STATICFILE_REQUEST';\nexport const DELETE_STATICFILE_SUCCESS = 'DELETE_STATICFILE_SUCCESS';\nexport const DELETE_STATICFILE_FAILURE = 'DELETE_STATICFILE_FAILURE';\n\n// Actions\nexport const fetchStaticFiles = (directory = '') => dispatch => {\n dispatch({ type: FETCH_STATICFILES_REQUEST });\n return get(\n staticfilesAPIUrl(directory),\n { type: FETCH_STATICFILES_SUCCESS, name: 'files' },\n { type: FETCH_STATICFILES_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const uploadStaticFiles = (directory, files) => dispatch => {\n _.each(files, file => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onloadend = () => {\n const payload = JSON.stringify({\n encoded_content: reader.result.split('base64,')[1],\n });\n // send the put request\n return fetch(staticfileAPIUrl(directory, file.name), {\n method: 'PUT',\n body: payload,\n credentials: 'same-origin',\n })\n .then(data => {\n dispatch({ type: PUT_STATICFILE_SUCCESS });\n dispatch(fetchStaticFiles(directory));\n dispatch(\n addNotification(\n getSuccessMessage(),\n getUploadSuccessMessage(file.name),\n 'success'\n )\n );\n })\n .catch(error => {\n dispatch({ type: PUT_STATICFILE_FAILURE, error });\n dispatch(\n addNotification(getErrorMessage(), getUploadErrorMessage(), 'error')\n );\n });\n };\n });\n};\n\nexport const deleteStaticFile = (directory, filename) => dispatch => {\n const relative_path = computeRelativePath(directory, filename);\n return del(\n staticfileAPIUrl(directory, filename),\n { type: DELETE_STATICFILE_SUCCESS, name: 'file', id: relative_path },\n { type: DELETE_STATICFILE_FAILURE, name: 'error' },\n dispatch\n );\n};\n\n// Reducer\nexport default function staticfiles(\n state = {\n files: [],\n isFetching: false,\n uploading: false, // TODO show loading gif\n },\n action\n) {\n switch (action.type) {\n case FETCH_STATICFILES_REQUEST:\n return {\n ...state,\n isFetching: true,\n };\n case FETCH_STATICFILES_SUCCESS:\n return {\n ...state,\n files: action.files,\n isFetching: false,\n };\n case FETCH_STATICFILES_FAILURE:\n return {\n ...state,\n isFetching: false,\n };\n case PUT_STATICFILE_REQUEST:\n return {\n ...state,\n uploading: true,\n };\n case PUT_STATICFILE_SUCCESS:\n return {\n ...state,\n uploading: false,\n };\n case PUT_STATICFILE_FAILURE:\n return {\n ...state,\n uploading: false,\n };\n case DELETE_STATICFILE_SUCCESS:\n return {\n ...state,\n files: filterDeleted(state.files, action.id),\n };\n default:\n return state;\n }\n}\n\n// Selectors\nexport const filterByFilename = (files, input) => {\n if (!input) {\n return files;\n }\n return files.filter(f => f.path.toLowerCase().includes(input.toLowerCase()));\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport DocumentTitle from 'react-document-title';\nimport Icon from '../../components/Icon';\nimport FilePreview from '../../components/FilePreview';\nimport Breadcrumbs from '../../components/Breadcrumbs';\nimport InputSearch from '../../components/form/InputSearch';\nimport { search } from '../../ducks/utils';\nimport { fetchStaticFiles, filterByFilename } from '../../ducks/staticfiles';\nimport { ADMIN_PREFIX } from '../../constants';\n\nexport class StaticIndex extends Component {\n componentDidMount() {\n const { fetchStaticFiles } = this.props;\n fetchStaticFiles('index');\n }\n\n renderDirectoryListingBtn() {\n const to = `${ADMIN_PREFIX}/staticfiles`;\n\n return (\n <div className=\"page-buttons\">\n <Link className=\"btn btn-view\" to={to}>\n Directory Listing\n </Link>\n </div>\n );\n }\n\n renderPreviewNode() {\n const { files, onClickStaticFile } = this.props;\n\n if (files.length) {\n return (\n <div className=\"preview-container\">\n {files.map((file, i) => {\n return (\n <FilePreview\n key={i}\n onClick={onClickStaticFile}\n splat=\"index\"\n file={file}\n />\n );\n })}\n </div>\n );\n } else {\n return (\n <div className=\"preview-info\">\n <Icon name=\"exclamation-triangle\" />\n <h2>No files found!</h2>\n <h4>\n Upload files at 'Directory Listing' to have them displayed here.\n </h4>\n </div>\n );\n }\n }\n\n render() {\n const { isFetching, search, modalView } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n return (\n <DocumentTitle title=\"Static File Listing\">\n <div>\n <div className=\"content-header\">\n <Breadcrumbs type=\"staticfiles\" />\n {!modalView && this.renderDirectoryListingBtn()}\n <div className=\"pull-right\">\n <InputSearch searchBy=\"filename\" search={search} />\n </div>\n </div>\n <div className=\"static-list\">{this.renderPreviewNode()}</div>\n </div>\n </DocumentTitle>\n );\n }\n}\n\nStaticIndex.propTypes = {\n files: PropTypes.array.isRequired,\n isFetching: PropTypes.bool.isRequired,\n fetchStaticFiles: PropTypes.func.isRequired,\n search: PropTypes.func.isRequired,\n onClickStaticFile: PropTypes.func,\n modalView: PropTypes.bool,\n};\n\nconst mapStateToProps = state => ({\n files: filterByFilename(state.staticfiles.files, state.utils.input),\n isFetching: state.staticfiles.isFetching,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchStaticFiles,\n search,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(StaticIndex);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Modal from 'react-modal';\nimport StaticIndex from '../containers/views/StaticIndex';\nimport Icon from './Icon';\n\nexport default class FilePicker extends Component {\n state = {\n showModal: false,\n };\n\n customStyles = {\n overlay: {\n backgroundColor: 'rgba(0,0,0,0.6)',\n zIndex: 10,\n },\n content: {\n margin: 20,\n paddingTop: 0,\n paddingRight: 10,\n paddingLeft: 15,\n },\n };\n\n openModal = () => this.setState({ showModal: true });\n shutModal = () => this.setState({ showModal: false });\n\n onPickItem = path => {\n this.props.onPick(path);\n this.shutModal();\n };\n\n render() {\n return (\n <span className=\"images-wrapper\">\n <button onClick={this.openModal} ref=\"trigger\">\n <Icon name=\"picture-o\" />\n </button>\n <Modal\n isOpen={this.state.showModal}\n contentLabel=\"FilePicker\"\n onRequestClose={this.shutModal}\n style={this.customStyles}\n >\n <div className=\"content\">\n <StaticIndex onClickStaticFile={this.onPickItem} modalView />\n </div>\n </Modal>\n </span>\n );\n }\n}\n\nFilePicker.propTypes = {\n onPick: PropTypes.func.isRequired,\n};\n","import React, { Component, PropTypes } from 'react';\nimport TextareaAutosize from 'react-textarea-autosize';\nimport classnames from 'classnames';\n\nimport translations from '../../translations';\nconst { getDeleteMessage } = translations;\n\nexport default class MetaTags extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tagInput: '',\n pageTags: props.fieldValue || [],\n autoSuggest: false,\n };\n }\n\n componentWillReceiveProps(nextProps) {\n const { fieldValue } = nextProps;\n this.setState({ pageTags: fieldValue || [] });\n }\n\n componentDidUpdate() {\n const { nameAttr, updateFieldValue } = this.props;\n updateFieldValue(nameAttr, this.state.pageTags);\n }\n\n createTag(value) {\n const { pageTags } = this.state;\n const clone = [...pageTags];\n\n // create tags only if they do not exist already\n if (!clone.includes(value)) {\n clone.push(value);\n\n this.setState(state => {\n return {\n pageTags: clone,\n tagInput: '',\n autoSuggest: false,\n };\n });\n }\n }\n\n deleteTag(index) {\n const { pageTags } = this.state;\n const clone = [...pageTags];\n\n const tagName = index === -1 ? clone.slice(-1).pop() : clone[index];\n const confirm = window.confirm(getDeleteMessage(`tag: ${tagName}`));\n\n if (confirm) {\n clone.splice(index, 1);\n this.setState({ pageTags: clone });\n this.refs.taginput.focus();\n }\n }\n\n // keys that when pressed and released creates a new tag from the input value.\n creators = [',', ' ', 'Enter'];\n\n handleKeyUp = e => {\n const { pageTags } = this.state;\n const input = e.target.value;\n\n if (input.length && this.creators.includes(e.key)) {\n this.createTag(input);\n } else if (pageTags.length && input.length === 0 && e.key === 'Backspace') {\n this.deleteTag(-1);\n }\n };\n\n handleOnChange = e => {\n const value = e.target.value;\n this.setState(state => {\n return { tagInput: value };\n });\n };\n\n showSuggestions = () => {\n this.setState(state => {\n return { autoSuggest: true };\n });\n };\n\n closeSuggestions = () => {\n this.setState(state => {\n return { autoSuggest: false };\n });\n };\n\n rectifyTag = tag => {\n const rectified = tag.toString().split(' ');\n this.setState(state => {\n return { pageTags: rectified };\n });\n };\n\n render() {\n const { pageTags } = this.state;\n const tagInput = `${this.state.tagInput}`;\n\n const suggestions = this.props.suggestions.filter(entry => {\n return entry.startsWith(tagInput);\n });\n\n if (!(pageTags instanceof Array)) {\n return (\n <span className=\"meta-error\">\n Expected an array of items. Found: <strong>{pageTags}</strong>\n <br />\n <span onClick={() => this.rectifyTag(pageTags)}>Click here</span>\n to correct.\n </span>\n );\n }\n\n const tagPool = pageTags.filter(Boolean); // filter out nil or empty elements\n const tags = tagPool.map((tag, i) => {\n return (\n <span key={i} className=\"tag\">\n {tag}\n <span className=\"delete-tag\" onClick={() => this.deleteTag(i)} />\n </span>\n );\n });\n\n const suggests = suggestions.map((item, i) => {\n if (!pageTags.includes(item)) {\n return (\n <li key={i} onClick={() => this.createTag(item)}>\n {item}\n </li>\n );\n }\n return null;\n }).filter(Boolean);\n\n const suggestionClasses = classnames('tag-suggestions', {\n visible: this.state.autoSuggest,\n });\n\n return (\n <div className=\"tags-wrap field value-field\">\n {tags.length > 0 && <div className=\"tags-list\">{tags}</div>}\n\n <div className=\"tags-input\">\n <input\n type=\"text\"\n onChange={this.handleOnChange}\n onFocus={this.showSuggestions}\n onKeyUp={this.handleKeyUp}\n value={tagInput.replace(/,|\\s+/, '')}\n ref=\"taginput\"\n />\n\n <TextareaAutosize\n className=\"field value-field\"\n value={this.state.pageTags.toString()}\n hidden\n />\n </div>\n {suggests.length > 0 && (\n <div className={suggestionClasses}>\n <ul>{suggests}</ul>\n <div className=\"close-suggestions\" onClick={this.closeSuggestions}>\n Close suggestions\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nMetaTags.defaultProps = {\n fieldValue: [],\n suggestions: [],\n};\n\nMetaTags.propTypes = {\n updateFieldValue: PropTypes.func.isRequired,\n nameAttr: PropTypes.any.isRequired,\n suggestions: PropTypes.array,\n fieldValue: PropTypes.any,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport TextareaAutosize from 'react-textarea-autosize';\nimport DateTimePicker from 'react-widgets/lib/DateTimePicker';\nimport DropdownList from 'react-widgets/lib/DropdownList';\nimport moment from 'moment';\nimport momentLocalizer from 'react-widgets-moment';\nimport FilePicker from '../FilePicker';\nimport MetaTags from './MetaTags';\nimport 'react-widgets/dist/css/react-widgets.css';\n\nmomentLocalizer(moment);\n\nexport class MetaSimple extends Component {\n handleEditableChange = e => {\n const { nameAttr, updateFieldValue } = this.props;\n updateFieldValue(nameAttr, e.target.value);\n };\n\n handleDatepickerChange = (date, dateStr) => {\n const { nameAttr, updateFieldValue } = this.props;\n let formatted = moment(date).format('YYYY-MM-DD HH:mm:ss');\n updateFieldValue(nameAttr, formatted);\n };\n\n handleEditableBlur = e => {\n const { nameAttr, updateFieldValue } = this.props;\n updateFieldValue(nameAttr, e.target.value.trim());\n };\n\n renderEditable() {\n const { fieldValue } = this.props;\n return (\n <TextareaAutosize\n onChange={this.handleEditableChange}\n onBlur={this.handleEditableBlur}\n className=\"field value-field\"\n value={`${fieldValue}`}\n />\n );\n }\n\n renderDatepicker() {\n const { fieldValue } = this.props;\n let dateValue = new Date(fieldValue);\n if (`${dateValue}` === 'Invalid Date') dateValue = null;\n return (\n <DateTimePicker\n onChange={this.handleDatepickerChange}\n className=\"date-field\"\n value={dateValue}\n />\n );\n }\n\n onPickItem = path => {\n const { nameAttr, updateFieldValue } = this.props;\n this.refs.imagepicker.value = path;\n updateFieldValue(nameAttr, path);\n };\n\n renderStaticFilePicker() {\n const { fieldValue } = this.props;\n return (\n <div className=\"imagepicker\">\n <TextareaAutosize\n onChange={this.handleEditableChange}\n className=\"field value-field\"\n value={fieldValue}\n ref=\"imagepicker\"\n />\n <FilePicker onPick={this.onPickItem} />\n </div>\n );\n }\n\n handleLayoutChange = value => {\n const { nameAttr, updateFieldValue } = this.props;\n updateFieldValue(nameAttr, value);\n };\n\n renderLayoutPicker() {\n const { fieldValue, siteMeta } = this.props;\n\n if (!siteMeta) return this.renderEditable();\n const layouts = siteMeta.layouts || [];\n\n return (\n <DropdownList\n className=\"layout-field\"\n data={['none', ...layouts]}\n defaultValue={fieldValue}\n onChange={this.handleLayoutChange}\n />\n );\n }\n\n renderTagsInput(key) {\n const { fieldValue, nameAttr, updateFieldValue, siteMeta } = this.props;\n const suggestions = (siteMeta && siteMeta[key]) || [];\n\n return (\n <MetaTags\n fieldValue={fieldValue}\n nameAttr={nameAttr}\n updateFieldValue={updateFieldValue}\n suggestions={suggestions}\n />\n );\n }\n\n render() {\n const { fieldKey, nameAttr } = this.props;\n\n let node;\n switch (fieldKey) {\n case 'date':\n node = this.renderDatepicker();\n break;\n case 'image':\n case 'file':\n node = this.renderStaticFilePicker();\n break;\n case 'tags':\n case 'categories':\n node = this.renderTagsInput(fieldKey);\n break;\n default:\n node = this.renderEditable();\n }\n\n if (nameAttr === \"metadata['layout']\") {\n node = this.renderLayoutPicker();\n }\n\n return <div className=\"meta-value\">{node}</div>;\n }\n}\n\nMetaSimple.propTypes = {\n parentType: PropTypes.string.isRequired,\n fieldKey: PropTypes.string.isRequired,\n fieldValue: PropTypes.any,\n updateFieldValue: PropTypes.func.isRequired,\n nameAttr: PropTypes.any.isRequired,\n siteMeta: PropTypes.object,\n};\n\nexport default MetaSimple;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport Icon from '../Icon';\n\nexport default class MetaButtons extends Component {\n state = {\n dropdown: false,\n };\n\n fieldTypes = {\n simple: {\n icon: 'pencil',\n label: 'Simple',\n },\n array: {\n icon: 'list-ol',\n label: 'List',\n },\n object: {\n icon: 'th-large',\n label: 'Object',\n },\n };\n\n fieldTypeKeys = Object.keys(this.fieldTypes);\n\n toggleDropdownState = () => {\n this.setState(state => {\n return { dropdown: !state.dropdown };\n });\n };\n\n renderDropdownItems(type) {\n const { onConvertClick, parentKey } = this.props;\n\n if (parentKey === 'tags') return null;\n\n return this.fieldTypeKeys\n .map((ftype, i) => {\n if (type !== ftype) {\n const { icon, label } = this.fieldTypes[ftype];\n return (\n <span key={i} onMouseDown={() => onConvertClick(ftype)}>\n <Icon name={icon} />\n Convert to {label}\n </span>\n );\n }\n\n return null;\n })\n .filter(Boolean);\n }\n\n render() {\n const {\n currentType,\n parentType,\n onRemoveClick,\n isDefaultField,\n } = this.props;\n const sortableHandle = (\n <span className=\"move\">\n <Icon name=\"arrows\" />\n </span>\n );\n\n const dropdownClasses = classnames('dropdown', {\n 'showing-dropdown': this.state.dropdown,\n });\n\n return (\n <div className=\"meta-buttons\">\n {parentType === 'array' && sortableHandle}\n <span className={dropdownClasses}>\n <a\n className=\"meta-button\"\n tabIndex=\"1\"\n onClick={this.toggleDropdownState}\n onBlur={() => this.setState({ dropdown: false })}\n >\n <Icon name=\"chevron-down\" />\n </a>\n <div className=\"dropdown-wrap\">\n {this.renderDropdownItems(currentType)}\n <span onMouseDown={() => onRemoveClick()} className=\"remove-field\">\n <Icon name={isDefaultField ? 'undo' : 'trash-o'} />\n {isDefaultField ? 'Revert to default' : 'Remove field'}\n </span>\n </div>\n </span>\n </div>\n );\n }\n}\n\nMetaButtons.propTypes = {\n currentType: PropTypes.string.isRequired,\n parentType: PropTypes.string.isRequired,\n onConvertClick: PropTypes.func.isRequired,\n onRemoveClick: PropTypes.func.isRequired,\n parentKey: PropTypes.string,\n isDefaultField: PropTypes.bool,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { findDOMNode } from 'react-dom';\nimport MetaArray from './MetaArray';\nimport MetaObject from './MetaObject';\nimport MetaSimple from './MetaSimple';\nimport MetaButtons from './MetaButtons';\n\nexport class MetaObjectItem extends Component {\n handleConvertClick(type) {\n const { convertField, nameAttr } = this.props;\n convertField(nameAttr, type);\n }\n\n handleKeyBlur() {\n const { namePrefix, fieldKey, updateFieldKey } = this.props;\n let currentValue = findDOMNode(this.refs.field_key).value;\n if (fieldKey !== currentValue && currentValue !== '') {\n updateFieldKey(namePrefix, fieldKey, currentValue);\n }\n }\n\n handleRemoveClick() {\n const { removeField, namePrefix, fieldKey } = this.props;\n removeField(namePrefix, fieldKey);\n }\n\n render() {\n const {\n type,\n fieldKey,\n fieldValue,\n nameAttr,\n addField,\n removeField,\n updateFieldKey,\n updateFieldValue,\n convertField,\n key_prefix,\n moveArrayItem,\n } = this.props;\n const FieldTypes = {\n array: MetaArray,\n object: MetaObject,\n simple: MetaSimple,\n };\n const CurrentComponent = FieldTypes[type];\n return (\n <div ref=\"wrap\" className=\"object-item-wrap\">\n <div className={`object-key ${type}`}>\n <input\n ref=\"field_key\"\n onBlur={e => this.handleKeyBlur(e)}\n defaultValue={fieldKey}\n className=\"field key-field\"\n type=\"text\"\n placeholder=\"Key\"\n />\n <MetaButtons\n currentType={type}\n parentType=\"object\"\n onConvertClick={type => this.handleConvertClick(type)}\n onRemoveClick={() => this.handleRemoveClick()}\n />\n </div>\n <div className=\"object-value\">\n <CurrentComponent\n key_prefix={key_prefix}\n parentType=\"object\"\n fieldKey={fieldKey}\n fieldValue={fieldValue}\n addField={addField}\n removeField={removeField}\n updateFieldKey={updateFieldKey}\n updateFieldValue={updateFieldValue}\n moveArrayItem={moveArrayItem}\n convertField={convertField}\n nameAttr={nameAttr}\n namePrefix={nameAttr}\n />\n </div>\n </div>\n );\n }\n}\n\nMetaObjectItem.propTypes = {\n type: PropTypes.string.isRequired,\n fieldKey: PropTypes.string.isRequired,\n fieldValue: PropTypes.any.isRequired,\n nameAttr: PropTypes.string.isRequired,\n namePrefix: PropTypes.string.isRequired,\n addField: PropTypes.func.isRequired,\n removeField: PropTypes.func.isRequired,\n convertField: PropTypes.func.isRequired,\n updateFieldKey: PropTypes.func.isRequired,\n updateFieldValue: PropTypes.func.isRequired,\n moveArrayItem: PropTypes.func.isRequired,\n key_prefix: PropTypes.string.isRequired,\n};\nexport default MetaObjectItem;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'underscore';\nimport MetaObjectItem from './MetaObjectItem';\nimport { computeFieldType } from '../../utils/metadata';\n\nexport class MetaObject extends Component {\n render() {\n const {\n fieldKey,\n fieldValue,\n namePrefix,\n addField,\n removeField,\n updateFieldKey,\n updateFieldValue,\n convertField,\n key_prefix,\n moveArrayItem,\n } = this.props;\n const items = _.map(fieldValue, (value, key) => {\n const type = computeFieldType(value, key);\n return (\n <MetaObjectItem\n key={key}\n key_prefix={key_prefix}\n fieldKey={key}\n fieldValue={value}\n type={type}\n addField={addField}\n removeField={removeField}\n updateFieldKey={updateFieldKey}\n updateFieldValue={updateFieldValue}\n moveArrayItem={moveArrayItem}\n convertField={convertField}\n nameAttr={`${namePrefix}['${key}']`}\n namePrefix={namePrefix}\n />\n );\n });\n return (\n <div className=\"meta-value-object\">\n {items}\n <a\n onClick={() => addField(namePrefix)}\n className=\"add-field-object\"\n title=\"Add new key/value pair\"\n >\n New key/value pair under <strong>{fieldKey}</strong>\n </a>\n </div>\n );\n }\n}\n\nMetaObject.propTypes = {\n fieldKey: PropTypes.string.isRequired,\n fieldValue: PropTypes.any.isRequired,\n nameAttr: PropTypes.string.isRequired,\n namePrefix: PropTypes.string.isRequired,\n addField: PropTypes.func.isRequired,\n removeField: PropTypes.func.isRequired,\n convertField: PropTypes.func.isRequired,\n updateFieldKey: PropTypes.func.isRequired,\n updateFieldValue: PropTypes.func.isRequired,\n moveArrayItem: PropTypes.func.isRequired,\n key_prefix: PropTypes.string.isRequired,\n};\n\nexport default MetaObject;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport MetaArray from './MetaArray';\nimport MetaObject from './MetaObject';\nimport MetaSimple from './MetaSimple';\nimport MetaButtons from './MetaButtons';\n\nexport class MetaArrayItem extends Component {\n handleConvertClick(type) {\n const { convertField, nameAttr } = this.props;\n convertField(nameAttr, type);\n }\n\n handleRemoveClick() {\n const { removeField, namePrefix, index } = this.props;\n removeField(namePrefix, index);\n }\n\n render() {\n const {\n type,\n fieldKey,\n fieldValue,\n index,\n nameAttr,\n addField,\n removeField,\n updateFieldKey,\n updateFieldValue,\n moveArrayItem,\n convertField,\n key_prefix,\n } = this.props;\n const FieldTypes = {\n array: MetaArray,\n object: MetaObject,\n simple: MetaSimple,\n };\n const CurrentComponent = FieldTypes[type];\n return (\n <div ref=\"wrap\" data-id={index} className=\"array-item-wrap\">\n <div className=\"array\">\n <div className=\"array-header\">\n <span className=\"array-field-num\">{index + 1}.</span>\n <MetaButtons\n currentType={type}\n parentType=\"array\"\n onConvertClick={type => this.handleConvertClick(type)}\n onRemoveClick={() => this.handleRemoveClick()}\n />\n </div>\n <CurrentComponent\n key_prefix={key_prefix}\n parentType=\"array\"\n fieldKey={fieldKey}\n fieldValue={fieldValue}\n addField={addField}\n removeField={removeField}\n updateFieldKey={updateFieldKey}\n updateFieldValue={updateFieldValue}\n moveArrayItem={moveArrayItem}\n convertField={convertField}\n nameAttr={nameAttr}\n namePrefix={nameAttr}\n />\n </div>\n </div>\n );\n }\n}\n\nMetaArrayItem.propTypes = {\n type: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n fieldKey: PropTypes.string.isRequired,\n fieldValue: PropTypes.any.isRequired,\n addField: PropTypes.func.isRequired,\n removeField: PropTypes.func.isRequired,\n updateFieldKey: PropTypes.func.isRequired,\n updateFieldValue: PropTypes.func.isRequired,\n moveArrayItem: PropTypes.func.isRequired,\n convertField: PropTypes.func.isRequired,\n nameAttr: PropTypes.string.isRequired,\n namePrefix: PropTypes.string.isRequired,\n key_prefix: PropTypes.string.isRequired,\n};\n\nexport default MetaArrayItem;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Sortable from 'sortablejs';\nimport Icon from '../Icon';\nimport MetaArrayItem from './MetaArrayItem';\nimport { computeFieldType } from '../../utils/metadata';\n\nexport class MetaArray extends Component {\n sortableGroupDecorator(component) {\n const { moveArrayItem, namePrefix } = this.props;\n if (component) {\n const options = {\n draggable: '.array-item-wrap',\n group: { name: 'meta-array-items', pull: false, put: false },\n handle: '.move',\n animation: 0,\n onEnd: e => {\n let srcInd = e.item.getAttribute('data-id');\n moveArrayItem(namePrefix, srcInd, e.newIndex);\n },\n };\n Sortable.create(component, options);\n }\n }\n\n render() {\n const {\n fieldKey,\n fieldValue,\n namePrefix,\n addField,\n removeField,\n updateFieldKey,\n updateFieldValue,\n moveArrayItem,\n convertField,\n key_prefix,\n } = this.props;\n const items = fieldValue.map((item, i) => {\n const type = computeFieldType(item);\n return (\n <MetaArrayItem\n key={`${key_prefix}-${i}`}\n key_prefix={key_prefix}\n index={i}\n fieldKey={fieldKey}\n fieldValue={item}\n type={type}\n addField={addField}\n removeField={removeField}\n updateFieldKey={updateFieldKey}\n updateFieldValue={updateFieldValue}\n moveArrayItem={moveArrayItem}\n convertField={convertField}\n nameAttr={`${namePrefix}[${i}]`}\n namePrefix={namePrefix}\n />\n );\n });\n return (\n <div\n className=\"meta-value-array\"\n ref={this.sortableGroupDecorator.bind(this)}\n >\n {items}\n <a\n onClick={() => addField(namePrefix)}\n className=\"add-field-array\"\n title=\"Add new list item\"\n >\n <Icon name=\"plus\" />\n </a>\n </div>\n );\n }\n}\n\nMetaArray.propTypes = {\n fieldKey: PropTypes.string.isRequired,\n fieldValue: PropTypes.any.isRequired,\n nameAttr: PropTypes.string.isRequired,\n namePrefix: PropTypes.string.isRequired,\n addField: PropTypes.func.isRequired,\n removeField: PropTypes.func.isRequired,\n updateFieldKey: PropTypes.func.isRequired,\n updateFieldValue: PropTypes.func.isRequired,\n convertField: PropTypes.func.isRequired,\n moveArrayItem: PropTypes.func.isRequired,\n key_prefix: PropTypes.string.isRequired,\n};\n\nexport default MetaArray;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { findDOMNode } from 'react-dom';\nimport MetaArray from './MetaArray';\nimport MetaObject from './MetaObject';\nimport MetaSimple from './MetaSimple';\nimport MetaButtons from './MetaButtons';\n\nexport class MetaField extends Component {\n componentDidMount() {\n const isNewField = /New field/.test(this.props.fieldKey);\n isNewField && this.refs.field_key.select();\n }\n\n handleConvertClick(type) {\n const { convertField, nameAttr } = this.props;\n convertField(nameAttr, type);\n }\n\n handleKeyBlur() {\n const { namePrefix, fieldKey, updateFieldKey } = this.props;\n let currentValue = findDOMNode(this.refs.field_key).value;\n if (fieldKey !== currentValue && currentValue !== '') {\n updateFieldKey(namePrefix, fieldKey, currentValue);\n }\n }\n\n handleRemoveClick() {\n const { removeField, namePrefix, fieldKey } = this.props;\n removeField(namePrefix, fieldKey);\n }\n\n render() {\n const {\n type,\n parentType,\n fieldKey,\n fieldValue,\n namePrefix,\n addField,\n removeField,\n updateFieldKey,\n updateFieldValue,\n moveArrayItem,\n convertField,\n key_prefix,\n siteMeta,\n isInDefaultState,\n isDefaultField,\n } = this.props;\n\n const FieldTypes = {\n array: MetaArray,\n object: MetaObject,\n simple: MetaSimple,\n };\n const CurrentComponent = FieldTypes[type];\n return (\n <div ref=\"wrap\" className=\"metafield\">\n <div className={`meta-key ${type}`}>\n <input\n ref=\"field_key\"\n onBlur={() => this.handleKeyBlur()}\n defaultValue={fieldKey}\n className=\"field key-field\"\n type=\"text\"\n placeholder=\"Key\"\n disabled={isInDefaultState}\n />\n <MetaButtons\n currentType={type}\n isDefaultField={isDefaultField}\n parentType=\"top\"\n parentKey={fieldKey}\n onConvertClick={type => this.handleConvertClick(type)}\n onRemoveClick={() => this.handleRemoveClick()}\n />\n </div>\n <CurrentComponent\n key_prefix={key_prefix}\n fieldKey={fieldKey}\n parentType={parentType}\n fieldValue={fieldValue}\n addField={addField}\n removeField={removeField}\n updateFieldKey={updateFieldKey}\n updateFieldValue={updateFieldValue}\n moveArrayItem={moveArrayItem}\n convertField={convertField}\n nameAttr={`${namePrefix}['${fieldKey}']`}\n namePrefix={`${namePrefix}['${fieldKey}']`}\n siteMeta={siteMeta}\n isInDefaultState={isInDefaultState}\n />\n </div>\n );\n }\n}\n\nMetaField.propTypes = {\n type: PropTypes.string.isRequired,\n parentType: PropTypes.string.isRequired,\n addField: PropTypes.func.isRequired,\n removeField: PropTypes.func.isRequired,\n updateFieldKey: PropTypes.func.isRequired,\n updateFieldValue: PropTypes.func.isRequired,\n moveArrayItem: PropTypes.func.isRequired,\n convertField: PropTypes.func.isRequired,\n fieldKey: PropTypes.string.isRequired,\n fieldValue: PropTypes.any,\n nameAttr: PropTypes.string.isRequired,\n namePrefix: PropTypes.string.isRequired,\n key_prefix: PropTypes.string.isRequired,\n siteMeta: PropTypes.object,\n isInDefaultState: PropTypes.bool,\n isDefaultField: PropTypes.bool,\n};\n\nexport default MetaField;\n","import {\n addFieldToMetadata,\n removeFieldFromMetadata,\n updateMetadataFieldKey,\n updateMetadataFieldValue,\n moveMetadataArrayItem,\n convertMetadataField,\n} from '../utils/metadata';\n\n// Action Types\nexport const UPDATE_TITLE = 'UPDATE_TITLE';\nexport const UPDATE_BODY = 'UPDATE_BODY';\nexport const UPDATE_PATH = 'UPDATE_PATH';\nexport const STORE_CONTENT_FIELDS = 'STORE_CONTENT_FIELDS';\nexport const ADD_METAFIELD = 'ADD_METAFIELD';\nexport const REMOVE_METAFIELD = 'REMOVE_METAFIELD';\nexport const UPDATE_FIELD_KEY = 'UPDATE_FIELD_KEY';\nexport const UPDATE_FIELD_VALUE = 'UPDATE_FIELD_VALUE';\nexport const MOVE_ARRAY_ITEM = 'MOVE_ARRAY_ITEM';\nexport const CONVERT_FIELD = 'CONVERT_FIELD';\nexport const ENABLE_FIELD = 'ENABLE_FIELD';\n\n// Actions\nexport const storeContentFields = content => ({\n type: STORE_CONTENT_FIELDS,\n content,\n});\n\nexport const addField = namePrefix => ({\n type: ADD_METAFIELD,\n namePrefix,\n});\n\nexport const removeField = (namePrefix, key) => ({\n type: REMOVE_METAFIELD,\n namePrefix,\n key,\n});\n\nexport const enableField = (nameAttr, value) => ({\n type: ENABLE_FIELD,\n nameAttr,\n value,\n});\n\nexport const updateFieldKey = (namePrefix, fieldKey, newKey) => ({\n type: UPDATE_FIELD_KEY,\n namePrefix,\n fieldKey,\n newKey,\n});\n\nexport const updateFieldValue = (nameAttr, value) => ({\n type: UPDATE_FIELD_VALUE,\n nameAttr,\n value,\n});\n\nexport const moveArrayItem = (namePrefix, srcInd, targetInd) => ({\n type: MOVE_ARRAY_ITEM,\n namePrefix,\n srcInd,\n targetInd,\n});\n\nexport const convertField = (nameAttr, convertType) => ({\n type: CONVERT_FIELD,\n nameAttr,\n convertType,\n});\n\nexport const updateTitle = title => ({\n type: UPDATE_TITLE,\n title,\n});\n\nexport const updateBody = body => ({\n type: UPDATE_BODY,\n body,\n});\n\nexport const updatePath = path => ({\n type: UPDATE_PATH,\n path,\n});\n\n// Reducer\nexport default function metadata( // TODO normalize the metadata\n state = {\n metadata: {},\n new_field_count: 1,\n key_prefix: '', // force children to be rerendered on sort\n fieldChanged: false,\n },\n action\n) {\n switch (action.type) {\n case UPDATE_TITLE:\n return {\n ...state,\n metadata: {\n ...state.metadata,\n title: action.title,\n },\n fieldChanged: true,\n };\n case UPDATE_BODY:\n return {\n ...state,\n metadata: {\n ...state.metadata,\n raw_content: action.body,\n },\n fieldChanged: true,\n };\n case UPDATE_PATH:\n return {\n ...state,\n metadata: {\n ...state.metadata,\n path: action.path,\n },\n fieldChanged: true,\n };\n case STORE_CONTENT_FIELDS:\n return {\n ...state,\n metadata: action.content,\n };\n case ADD_METAFIELD:\n return {\n ...state,\n metadata: addFieldToMetadata(state, action.namePrefix),\n new_field_count: state.new_field_count + 1,\n };\n case REMOVE_METAFIELD:\n return {\n ...state,\n metadata: removeFieldFromMetadata(state, action.namePrefix, action.key),\n fieldChanged: true,\n key_prefix: `${Math.random() * 100}`,\n };\n case UPDATE_FIELD_KEY:\n return {\n ...state,\n metadata: updateMetadataFieldKey(\n state,\n action.namePrefix,\n action.fieldKey,\n action.newKey.trim()\n ),\n fieldChanged: true,\n };\n case UPDATE_FIELD_VALUE:\n return {\n ...state,\n metadata: updateMetadataFieldValue(\n state,\n action.nameAttr,\n action.value\n ),\n fieldChanged: true,\n };\n case MOVE_ARRAY_ITEM:\n return {\n ...state,\n metadata: moveMetadataArrayItem(\n state,\n action.namePrefix,\n action.srcInd,\n action.targetInd\n ),\n key_prefix: `${Math.random() * 100}`,\n fieldChanged: true,\n };\n case CONVERT_FIELD:\n return {\n ...state,\n metadata: convertMetadataField(\n state,\n action.nameAttr,\n action.convertType\n ),\n new_field_count: state.new_field_count + 1,\n fieldChanged: true,\n };\n case ENABLE_FIELD:\n return {\n ...state,\n metadata: updateMetadataFieldValue(\n state,\n action.nameAttr,\n action.value\n ),\n fieldChanged: true,\n };\n default:\n return {\n ...state,\n fieldChanged: false,\n };\n }\n}\n","import { getSiteMetaUrl } from '../constants/api';\nimport { get } from '../utils/fetch';\n\n// Action Types\nexport const FETCH_SITE_META_REQUEST = 'FETCH_SITE_META_REQUEST';\nexport const FETCH_SITE_META_SUCCESS = 'FETCH_SITE_META_SUCCESS';\nexport const FETCH_SITE_META_FAILURE = 'FETCH_SITE_META_FAILURE';\n\n// Actions\nexport const fetchSiteMeta = () => dispatch => {\n dispatch({ type: FETCH_SITE_META_REQUEST });\n return get(\n getSiteMetaUrl(),\n { type: FETCH_SITE_META_SUCCESS, name: 'site' },\n { type: FETCH_SITE_META_FAILURE, name: 'error' },\n dispatch\n );\n};\n\n// Reducer\nexport default function siteMeta(\n state = {\n site: {},\n isFetching: false,\n },\n action\n) {\n switch (action.type) {\n case FETCH_SITE_META_REQUEST:\n return {\n ...state,\n isFetching: true,\n };\n case FETCH_SITE_META_SUCCESS:\n return {\n ...state,\n site: action.site,\n isFetching: false,\n };\n case FETCH_SITE_META_FAILURE:\n return {\n ...state,\n isFetching: false,\n };\n default:\n return state;\n }\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport _ from 'underscore';\nimport StaticMetaField from '../components/metadata/statics/StaticMetaField';\nimport MetaField from '../components/metadata/MetaField';\nimport Icon from '../components/Icon';\nimport {\n storeContentFields,\n addField,\n removeField,\n updateFieldKey,\n updateFieldValue,\n moveArrayItem,\n convertField,\n enableField,\n} from '../ducks/metadata';\nimport { fetchSiteMeta } from '../ducks/siteMeta';\nimport { computeFieldType } from '../utils/metadata';\n\nexport class MetaFields extends Component {\n componentDidMount() {\n const { storeContentFields, fields, fetchSiteMeta, dataview } = this.props;\n if (!dataview) fetchSiteMeta();\n storeContentFields(fields);\n }\n\n shouldComponentUpdate(nextProps) {\n return !_.isEqual(nextProps.metadata, this.props.metadata);\n }\n\n render() {\n const {\n metadata,\n addField,\n enableField,\n removeField,\n updateFieldKey,\n updateFieldValue,\n moveArrayItem,\n convertField,\n key_prefix,\n dataview,\n site,\n staticFields,\n } = this.props;\n\n let visibleKeys = { ...staticFields, ...metadata };\n\n if (!dataview) {\n visibleKeys = _.omit(visibleKeys, ['title', 'path', 'raw_content']);\n }\n\n const metafieldsClass = classnames({\n datafields: dataview,\n metafields: !dataview,\n });\n\n const defaultFieldsNotOverwritten = _.omit(\n staticFields,\n Object.keys(metadata)\n );\n\n const metafields = _.map(visibleKeys, (field, key) => {\n const type = computeFieldType(field, key);\n if (defaultFieldsNotOverwritten.hasOwnProperty(key)) {\n return (\n <StaticMetaField\n key={key}\n type={type}\n fieldKey={key}\n fieldValue={field}\n enableField={enableField}\n />\n );\n }\n\n return (\n <MetaField\n key={key}\n key_prefix={key_prefix}\n type={type}\n parentType=\"top\"\n fieldKey={key}\n fieldValue={field}\n addField={addField}\n removeField={removeField}\n updateFieldKey={updateFieldKey}\n updateFieldValue={updateFieldValue}\n moveArrayItem={moveArrayItem}\n convertField={convertField}\n nameAttr={`metadata['${key}']`}\n namePrefix={`metadata`}\n siteMeta={dataview ? null : site}\n isInDefaultState={defaultFieldsNotOverwritten.hasOwnProperty(key)}\n isDefaultField={staticFields && staticFields.hasOwnProperty(key)}\n />\n );\n });\n\n const newWrapper = dataview ? (\n <div className=\"data-new\">\n <a onClick={() => addField('metadata')}>\n <Icon name=\"plus-circle\" /> New data field\n </a>\n </div>\n ) : (\n <div className=\"meta-new\">\n <a onClick={() => addField('metadata')} className=\"tooltip\">\n <Icon name=\"plus-circle\" /> New metadata field\n <span className=\"tooltip-text\">\n Metadata will be stored as the <b>YAML front matter</b> within the\n document.\n </span>\n </a>\n <small className=\"tooltip pull-right\">\n <Icon name=\"info-circle\" />\n Special Keys\n <span className=\"tooltip-text\">\n You can use special keys like <b>date</b>, <b>file</b>, <b>image</b>\n , <b>layout</b> or <b>tags</b> for user-friendly functionalities.\n </span>\n </small>\n </div>\n );\n\n return (\n <div className={metafieldsClass}>\n {metafields}\n {newWrapper}\n </div>\n );\n }\n}\n\nMetaFields.propTypes = {\n fields: PropTypes.object.isRequired,\n metadata: PropTypes.object.isRequired,\n key_prefix: PropTypes.string.isRequired,\n storeContentFields: PropTypes.func.isRequired,\n addField: PropTypes.func.isRequired,\n removeField: PropTypes.func.isRequired,\n updateFieldKey: PropTypes.func.isRequired,\n updateFieldValue: PropTypes.func.isRequired,\n moveArrayItem: PropTypes.func.isRequired,\n convertField: PropTypes.func.isRequired,\n fetchSiteMeta: PropTypes.func.isRequired,\n dataview: PropTypes.bool,\n site: PropTypes.object,\n staticFields: PropTypes.object.isRequired,\n enableField: PropTypes.func.isRequired,\n};\n\nconst mapStateToProps = state => ({\n metadata: state.metadata.metadata,\n key_prefix: state.metadata.key_prefix,\n site: state.meta.site,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n storeContentFields,\n fetchSiteMeta,\n addField,\n enableField,\n removeField,\n updateFieldKey,\n updateFieldValue,\n moveArrayItem,\n convertField,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MetaFields);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport MetaFields from '../containers/MetaFields';\n\nclass DataGUI extends Component {\n handleChange = e => this.props.onChange(e.target.value);\n\n renderPathFields(slug, ext) {\n return (\n <form className=\"datafile-path\">\n <fieldset className=\"filename\">\n <legend>Path (without extension)</legend>\n <input\n type=\"text\"\n id=\"path\"\n defaultValue={slug}\n placeholder=\"filename\"\n onChange={this.handleChange}\n ref=\"filepath\"\n />\n </fieldset>\n <fieldset className=\"file-type\">\n <legend>File Type</legend>\n <select\n id=\"extn\"\n defaultValue={ext}\n onChange={this.handleChange}\n ref=\"extname\"\n >\n <option value=\".yml\">YAML</option>\n <option value=\".json\">JSON</option>\n </select>\n </fieldset>\n </form>\n );\n }\n\n render() {\n const { fields, slug, ext, restricted } = this.props;\n return (\n <div>\n <div className=\"warning\">\n CAUTION! Any existing comments will be lost when editing via this\n view. Switch to the <strong>Raw Editor</strong> to preserve them.\n </div>\n {!restricted && this.renderPathFields(slug, ext)}\n <MetaFields fields={fields} dataview />\n </div>\n );\n }\n}\n\nDataGUI.defaultProps = {\n fields: {},\n slug: '',\n ext: '',\n restricted: false,\n};\n\nDataGUI.propTypes = {\n onChange: PropTypes.func.isRequired,\n fields: PropTypes.object,\n slug: PropTypes.string,\n ext: PropTypes.string,\n restricted: PropTypes.bool,\n};\n\nexport default DataGUI;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport AceEditor from 'react-ace';\nimport 'brace/mode/json';\nimport 'brace/mode/yaml';\nimport 'brace/theme/monokai';\n\nclass Editor extends Component {\n shouldComponentUpdate(nextProps, nextState) {\n return nextProps.content !== this.props.content;\n }\n\n handleChange = () => {\n const { onEditorChange, editorChanged } = this.props;\n !editorChanged && onEditorChange();\n };\n\n getValue() {\n return this.refs.ace.editor.getValue();\n }\n\n render() {\n const { content, type } = this.props;\n const mode = /json/i.test(type) ? 'json' : 'yaml';\n return (\n <div>\n <AceEditor\n value={content}\n mode={mode}\n theme=\"monokai\"\n width=\"100%\"\n height=\"400px\"\n showGutter={false}\n showPrintMargin={false}\n highlightActiveLine={false}\n className=\"config-editor\"\n fontSize={14}\n scrollMargin={[15, 15, 15, 15]}\n ref=\"ace\"\n onChange={this.handleChange}\n />\n <div className=\"statusbar\">mode: {mode.toUpperCase()}</div>\n </div>\n );\n }\n}\n\nEditor.propTypes = {\n content: PropTypes.any.isRequired,\n onEditorChange: PropTypes.func.isRequired,\n editorChanged: PropTypes.bool.isRequired,\n type: PropTypes.string,\n};\n\nexport default Editor;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'underscore';\n\nconst Errors = ({ errors }) => (\n <div className=\"error-messages\">\n {_.map(errors, (error, i) => <div key={i}>{error}</div>)}\n </div>\n);\n\nErrors.propTypes = {\n errors: PropTypes.array.isRequired,\n};\n\nexport default Errors;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport Icon from './Icon';\n\nimport translations from '../translations';\nconst { labels } = translations;\n\nconst iconMap = {\n create: 'plus-square',\n delete: 'trash',\n publish: 'send-o',\n save: 'save',\n upload: 'upload',\n view: 'eye',\n};\n\nexport default function Button({\n type,\n active,\n triggered,\n onClick,\n block,\n thin,\n icon,\n to,\n}) {\n const btnClass = classnames('btn', {\n 'btn-active': active,\n 'btn-success': active && (type === 'save' || type === 'create'),\n 'btn-delete': type === 'delete',\n 'btn-view': type === 'view' || type === 'publish',\n 'btn-inactive': !active,\n 'btn-fat': block,\n 'btn-thin': thin,\n });\n\n let label, triggeredLabel;\n switch (type) {\n case 'save':\n case 'create':\n label = labels[type].label;\n triggeredLabel = labels[type].triggeredLabel;\n break;\n case 'view-toggle':\n label = labels.viewToggle.label;\n triggeredLabel = labels.viewToggle.triggeredLabel;\n break;\n case 'view':\n case 'delete':\n case 'upload':\n case 'publish':\n label = labels[type].label;\n break;\n default:\n label = '<LABEL>';\n triggeredLabel = '<NEXT LABEL>';\n }\n\n const iconName = icon || iconMap[type];\n const iconNode = iconName && <Icon name={iconName} />;\n\n if (to) {\n return (\n <a href={to} target=\"_blank\" rel=\"noopener noreferrer\" className={btnClass}>\n {iconNode}\n {label}\n </a>\n );\n } else if (onClick) {\n return (\n <button onClick={onClick} className={btnClass}>\n {iconNode}\n {triggered ? triggeredLabel : label}\n </button>\n );\n }\n\n return null;\n}\n\nButton.propTypes = {\n type: PropTypes.string.isRequired,\n active: PropTypes.bool.isRequired,\n onClick: PropTypes.func,\n triggered: PropTypes.bool,\n block: PropTypes.bool,\n thin: PropTypes.bool,\n icon: PropTypes.string,\n to: PropTypes.string,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { withRouter } from 'react-router';\nimport { HotKeys } from 'react-hotkeys';\nimport DocumentTitle from 'react-document-title';\nimport DataGUI from '../../components/DataGUI';\nimport Editor from '../../components/Editor';\nimport Errors from '../../components/Errors';\nimport Button from '../../components/Button';\nimport { putConfig, onEditorChange } from '../../ducks/config';\nimport { clearErrors } from '../../ducks/utils';\nimport { preventDefault } from '../../utils/helpers';\n\nimport translations from '../../translations';\nconst { getLeaveMessage } = translations;\n\nexport class Configuration extends Component {\n state = {\n guiView: false,\n };\n\n componentDidMount() {\n const { router, route } = this.props;\n router.setRouteLeaveHook(route, this.routerWillLeave);\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n const { editorChanged, fieldChanged } = this.props;\n if (editorChanged || fieldChanged) {\n return getLeaveMessage();\n }\n };\n\n toggleView = () => {\n this.setState(state => {\n return { guiView: !state.guiView };\n });\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const { editorChanged, fieldChanged, putConfig } = this.props;\n if (editorChanged) {\n const value = this.refs.editor.getValue();\n putConfig(value);\n } else if (fieldChanged) {\n putConfig(null, 'gui');\n }\n };\n\n renderContentBody() {\n const { config, editorChanged, onEditorChange } = this.props;\n const { raw_content, content } = config;\n\n if (this.state.guiView && content) {\n return <DataGUI fields={content} onChange={onEditorChange} restricted />;\n }\n\n return (\n <Editor\n editorChanged={editorChanged}\n onEditorChange={onEditorChange}\n content={raw_content}\n ref=\"editor\"\n />\n );\n }\n\n render() {\n const { editorChanged, fieldChanged, updated, errors } = this.props;\n\n const keyboardHandlers = {\n save: this.handleClickSave,\n };\n\n return (\n <DocumentTitle title=\"Configuration\">\n <HotKeys handlers={keyboardHandlers} className=\"single\">\n {errors && errors.length > 0 && <Errors errors={errors} />}\n <div className=\"content-header\">\n <h1>Configuration</h1>\n <div className=\"page-buttons multiple\">\n <Button\n onClick={this.toggleView}\n type=\"view-toggle\"\n triggered={this.state.guiView}\n active\n block\n />\n <Button\n onClick={this.handleClickSave}\n type=\"save\"\n active={editorChanged || fieldChanged}\n triggered={updated}\n block\n />\n </div>\n </div>\n <div className=\"content-body\">{this.renderContentBody()}</div>\n </HotKeys>\n </DocumentTitle>\n );\n }\n}\n\nConfiguration.propTypes = {\n config: PropTypes.object.isRequired,\n onEditorChange: PropTypes.func.isRequired,\n putConfig: PropTypes.func.isRequired,\n updated: PropTypes.bool.isRequired,\n editorChanged: PropTypes.bool.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n errors: PropTypes.array.isRequired,\n clearErrors: PropTypes.func.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n config: state.config.config,\n updated: state.config.updated,\n editorChanged: state.config.editorChanged,\n fieldChanged: state.metadata.fieldChanged,\n errors: state.utils.errors,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators({ putConfig, onEditorChange, clearErrors }, dispatch);\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(Configuration)\n);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { browserHistory, Link } from 'react-router';\nimport Breadcrumbs from './Breadcrumbs';\nimport Button from './Button';\nimport Icon from './Icon';\nimport InputSearch from './form/InputSearch';\nimport { ADMIN_PREFIX } from '../constants';\n\nimport translations from '../translations';\nconst { getDeleteMessage, getNotFoundMessage } = translations;\n\nexport default class Explorer extends Component {\n handleClickDelete(filename) {\n const { deleteItem, params, type } = this.props;\n const confirm = window.confirm(getDeleteMessage(filename));\n const dir = params.splat ? `/${params.splat}` : '';\n if (confirm) {\n deleteItem(params.splat, filename);\n browserHistory.push(`${ADMIN_PREFIX}/${type}${dir}`);\n }\n }\n\n renderTitleCell(name, icon, type, path) {\n return (\n <td className=\"row-title\">\n <strong>\n <Link to={`${ADMIN_PREFIX}/${type}/${path}`}>\n <Icon name={icon} />\n {name}\n </Link>\n </strong>\n </td>\n );\n }\n\n renderDirectoryRow(directory, type, index) {\n const { name, relative_path } = directory;\n return (\n <tr key={index}>\n {this.renderTitleCell(name, 'folder', type, relative_path)}\n <td />\n </tr>\n );\n }\n\n renderFileRow(file, type, index) {\n const { name, relative_path, http_url } = file;\n return (\n <tr key={index}>\n {this.renderTitleCell(name, 'file-text-o', type, relative_path)}\n <td>\n <div className=\"row-actions\">\n <Button\n onClick={() => this.handleClickDelete(name)}\n type=\"delete\"\n active\n thin\n />\n {http_url && <Button to={http_url} type=\"view\" active thin />}\n </div>\n </td>\n </tr>\n );\n }\n\n renderRows() {\n const { items, type } = this.props;\n return items.map((entry, index) =>\n entry.type === 'directory'\n ? this.renderDirectoryRow(entry, type, index)\n : this.renderFileRow(entry, type, index)\n );\n }\n\n render() {\n const { items, type, newBtnLabel, search, params } = this.props;\n const typeLabel = type === 'datafiles' ? 'data files' : type;\n\n const to = params.splat\n ? `${ADMIN_PREFIX}/${type}/${params.splat}/new`\n : `${ADMIN_PREFIX}/${type}/new`;\n\n const content = items.length ? (\n <div className=\"content-table\">\n <table>\n <thead>\n <tr>\n <th>Filename</th>\n <th className=\"th-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>{this.renderRows()}</tbody>\n </table>\n </div>\n ) : (\n <h1>{getNotFoundMessage(typeLabel)}</h1>\n );\n\n return (\n <div>\n <div className=\"content-header\">\n <Breadcrumbs type={type} splat={params.splat} />\n <div className=\"page-buttons\">\n <Link className=\"btn btn-active\" to={to}>\n {newBtnLabel}\n </Link>\n </div>\n <div className=\"pull-right\">\n <InputSearch searchBy=\"filename\" search={search} />\n </div>\n </div>\n {content}\n </div>\n );\n }\n}\n\nExplorer.propTypes = {\n type: PropTypes.string.isRequired,\n items: PropTypes.array.isRequired,\n params: PropTypes.object.isRequired,\n newBtnLabel: PropTypes.string.isRequired,\n deleteItem: PropTypes.func.isRequired,\n search: PropTypes.func.isRequired,\n};\n","import { clearErrors, validationError, filterDeleted } from './utils';\nimport { get, put, del } from '../utils/fetch';\nimport { validatePage } from '../utils/validation';\nimport {\n slugify,\n preparePayload,\n sanitizeFrontMatter,\n computeRelativePath,\n} from '../utils/helpers';\nimport { pagesAPIUrl, pageAPIUrl } from '../constants/api';\n\n// Action Types\nexport const FETCH_PAGES_REQUEST = 'FETCH_PAGES_REQUEST';\nexport const FETCH_PAGES_SUCCESS = 'FETCH_PAGES_SUCCESS';\nexport const FETCH_PAGES_FAILURE = 'FETCH_PAGES_FAILURE';\nexport const FETCH_PAGE_REQUEST = 'FETCH_PAGE_REQUEST';\nexport const FETCH_PAGE_SUCCESS = 'FETCH_PAGE_SUCCESS';\nexport const FETCH_PAGE_FAILURE = 'FETCH_PAGE_FAILURE';\nexport const PUT_PAGE_REQUEST = 'PUT_PAGE_REQUEST';\nexport const PUT_PAGE_SUCCESS = 'PUT_PAGE_SUCCESS';\nexport const PUT_PAGE_FAILURE = 'PUT_PAGE_FAILURE';\nexport const DELETE_PAGE_REQUEST = 'DELETE_PAGE_REQUEST';\nexport const DELETE_PAGE_SUCCESS = 'DELETE_PAGE_SUCCESS';\nexport const DELETE_PAGE_FAILURE = 'DELETE_PAGE_FAILURE';\n\n// Actions\nexport const fetchPages = (directory = '') => dispatch => {\n dispatch({ type: FETCH_PAGES_REQUEST });\n return get(\n pagesAPIUrl(directory),\n { type: FETCH_PAGES_SUCCESS, name: 'pages' },\n { type: FETCH_PAGES_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const fetchPage = (directory, filename) => dispatch => {\n dispatch({ type: FETCH_PAGE_REQUEST });\n return get(\n pageAPIUrl(directory, filename),\n { type: FETCH_PAGE_SUCCESS, name: 'page' },\n { type: FETCH_PAGE_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const createPage = directory => (dispatch, getState) => {\n // get edited fields from metadata state\n const metadata = getState().metadata.metadata;\n let { path, raw_content, title } = metadata;\n // if `path` is a falsy value or if appending a slash to it equals to\n // `directory`, generate filename from `title`.\n if ((!path || `${path}/` === directory) && title) {\n path = `${slugify(title)}.md`;\n } else {\n const errors = validatePage(metadata);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n }\n // clear errors\n dispatch(clearErrors());\n\n const front_matter = sanitizeFrontMatter(metadata);\n\n // send the put request\n return put(\n pageAPIUrl(directory, path),\n preparePayload({ front_matter, raw_content }),\n { type: PUT_PAGE_SUCCESS, name: 'page' },\n { type: PUT_PAGE_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const putPage = (directory, filename) => (dispatch, getState) => {\n // get edited fields from metadata state\n const metadata = getState().metadata.metadata;\n let { path, raw_content, title } = metadata;\n // if `path` is a falsy value or if appending a slash to it equals to\n // `directory`, generate filename from `title`.\n if ((!path || `${path}/` === directory) && title) {\n path = `${slugify(title)}.md`;\n } else {\n const errors = validatePage(metadata);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n }\n // clear errors\n dispatch(clearErrors());\n\n const front_matter = sanitizeFrontMatter(metadata);\n const relative_path = directory ? `${directory}/${path}` : path;\n\n // send the put request\n return put(\n pageAPIUrl(directory, filename),\n preparePayload({ path: relative_path, front_matter, raw_content }),\n { type: PUT_PAGE_SUCCESS, name: 'page' },\n { type: PUT_PAGE_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const deletePage = (directory, filename) => dispatch => {\n const relative_path = computeRelativePath(directory, filename);\n return del(\n pageAPIUrl(directory, filename),\n { type: DELETE_PAGE_SUCCESS, name: 'page', id: relative_path },\n { type: DELETE_PAGE_FAILURE, name: 'error' },\n dispatch\n );\n};\n\n// Reducer\nexport default function pages(\n state = {\n pages: [],\n page: {},\n isFetching: false,\n updated: false,\n },\n action\n) {\n switch (action.type) {\n case FETCH_PAGES_REQUEST:\n case FETCH_PAGE_REQUEST:\n return {\n ...state,\n isFetching: true,\n };\n case FETCH_PAGES_SUCCESS:\n return {\n ...state,\n pages: action.pages,\n isFetching: false,\n page: {},\n };\n case FETCH_PAGES_FAILURE:\n return {\n ...state,\n isFetching: false,\n pages: [],\n };\n case FETCH_PAGE_SUCCESS:\n return {\n ...state,\n page: action.page,\n isFetching: false,\n };\n case FETCH_PAGE_FAILURE:\n return {\n ...state,\n page: {},\n isFetching: false,\n };\n case PUT_PAGE_SUCCESS:\n return {\n ...state,\n page: action.page,\n updated: true,\n };\n case DELETE_PAGE_SUCCESS:\n return {\n ...state,\n pages: filterDeleted(state.pages, action.id),\n };\n default:\n return {\n ...state,\n updated: false,\n };\n }\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport DocumentTitle from 'react-document-title';\nimport Explorer from '../../components/Explorer';\nimport { search, filterBySearchInput } from '../../ducks/utils';\nimport { fetchPages, deletePage } from '../../ducks/pages';\nimport { getDocumentTitle } from '../../utils/helpers';\n\nexport class Pages extends Component {\n componentDidMount() {\n const { fetchPages, params } = this.props;\n fetchPages(params.splat);\n }\n\n componentWillReceiveProps(nextProps) {\n const { fetchPages } = nextProps;\n if (this.props.params.splat !== nextProps.params.splat) {\n fetchPages(nextProps.params.splat);\n }\n }\n\n render() {\n const { isFetching, pages, search, params, deletePage } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n const title = getDocumentTitle('pages', params.splat);\n\n return (\n <DocumentTitle title={title}>\n <Explorer\n type=\"pages\"\n items={pages}\n params={params}\n newBtnLabel=\"New page\"\n search={search}\n deleteItem={deletePage}\n />\n </DocumentTitle>\n );\n }\n}\n\nPages.propTypes = {\n pages: PropTypes.array.isRequired,\n fetchPages: PropTypes.func.isRequired,\n deletePage: PropTypes.func.isRequired,\n isFetching: PropTypes.bool.isRequired,\n search: PropTypes.func.isRequired,\n params: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n pages: filterBySearchInput(state.pages.pages, state.utils.input),\n isFetching: state.pages.isFetching,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchPages,\n deletePage,\n search,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Pages);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport TextareaAutosize from 'react-textarea-autosize';\nimport moment from 'moment';\nimport Icon from '../Icon';\n\nexport default class InputFilename extends Component {\n handleChange = e => {\n const { onChange } = this.props;\n\n // The `TextareaAutosize` has a `value` attribute\n // which is supposed to be set to its inner `TextArea`'s value\n // but is always undefined\n // So this is a workaround\n this.refs.input.value = e.target.value;\n\n onChange(e.target.value);\n };\n\n render() {\n const { path, type } = this.props;\n\n let placeholder = 'example.md';\n if (type === 'posts') {\n const date = moment().format('YYYY-MM-DD');\n placeholder = `${date}-your-title.md`;\n } else if (type === 'data files') {\n placeholder = 'your-filename.yml';\n }\n\n let tooltip = null;\n if (type !== 'data files') {\n tooltip = (\n <span className=\"tooltip\">\n <Icon name=\"info-circle\" />\n <span className=\"tooltip-text\">\n If you leave <b>path</b> blank, it will be autogenerated from title.\n </span>\n </span>\n );\n }\n return (\n <div className=\"input-path\">\n <label>Path {tooltip}</label>\n <TextareaAutosize\n key={path}\n onChange={this.handleChange}\n placeholder={placeholder}\n defaultValue={path}\n ref=\"input\"\n />\n </div>\n );\n }\n}\n\nInputFilename.propTypes = {\n path: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport TextareaAutosize from 'react-textarea-autosize';\n\nexport default class InputTitle extends Component {\n shouldComponentUpdate(nextProps) {\n return nextProps.title !== this.props.title;\n }\n\n handleChange = e => {\n const { onChange } = this.props;\n onChange(e.target.value);\n };\n\n render() {\n const { title } = this.props;\n return (\n <div className=\"input-title\">\n <label>Title</label>\n <TextareaAutosize\n onChange={this.handleChange}\n placeholder=\"Title\"\n defaultValue={title}\n ref=\"input\"\n />\n </div>\n );\n }\n}\n\nInputTitle.propTypes = {\n title: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n};\n","/* eslint-disable */\n\nimport hljs from 'highlight.js/lib/highlight';\n\n// ---\n// Languages supported as of highlight.js v9.17.1.\n//\n// We can't have a dynamic require statement below because webpack doesn't\n// evaluate statements and will therefore include all languages in the final\n// bundle unless webpack is additionally configured to not include the languages\n// we don't intend to include.\n// ---\n\nhljs.registerLanguage('actionscript', require('highlight.js/lib/languages/actionscript'));\nhljs.registerLanguage('apache', require('highlight.js/lib/languages/apache'));\nhljs.registerLanguage('applescript', require('highlight.js/lib/languages/applescript'));\nhljs.registerLanguage('asciidoc', require('highlight.js/lib/languages/asciidoc'));\nhljs.registerLanguage('bash', require('highlight.js/lib/languages/bash'));\nhljs.registerLanguage('basic', require('highlight.js/lib/languages/basic'));\nhljs.registerLanguage('clojure', require('highlight.js/lib/languages/clojure'));\nhljs.registerLanguage('clojure-repl', require('highlight.js/lib/languages/clojure-repl'));\nhljs.registerLanguage('cmake', require('highlight.js/lib/languages/cmake'));\nhljs.registerLanguage('coffeescript', require('highlight.js/lib/languages/coffeescript'));\nhljs.registerLanguage('cpp', require('highlight.js/lib/languages/cpp'));\nhljs.registerLanguage('crystal', require('highlight.js/lib/languages/crystal'));\nhljs.registerLanguage('css', require('highlight.js/lib/languages/css'));\nhljs.registerLanguage('dart', require('highlight.js/lib/languages/dart'));\nhljs.registerLanguage('diff', require('highlight.js/lib/languages/diff'));\nhljs.registerLanguage('django', require('highlight.js/lib/languages/django'));\nhljs.registerLanguage('dns', require('highlight.js/lib/languages/dns'));\nhljs.registerLanguage('dockerfile', require('highlight.js/lib/languages/dockerfile'));\nhljs.registerLanguage('dos', require('highlight.js/lib/languages/dos'));\nhljs.registerLanguage('dsconfig', require('highlight.js/lib/languages/dsconfig'));\nhljs.registerLanguage('elixir', require('highlight.js/lib/languages/elixir'));\nhljs.registerLanguage('elm', require('highlight.js/lib/languages/elm'));\nhljs.registerLanguage('erb', require('highlight.js/lib/languages/erb'));\nhljs.registerLanguage('erlang-repl', require('highlight.js/lib/languages/erlang-repl'));\nhljs.registerLanguage('erlang', require('highlight.js/lib/languages/erlang'));\nhljs.registerLanguage('excel', require('highlight.js/lib/languages/excel'));\nhljs.registerLanguage('fortran', require('highlight.js/lib/languages/fortran'));\nhljs.registerLanguage('fsharp', require('highlight.js/lib/languages/fsharp'));\nhljs.registerLanguage('gherkin', require('highlight.js/lib/languages/gherkin'));\nhljs.registerLanguage('go', require('highlight.js/lib/languages/go'));\nhljs.registerLanguage('gradle', require('highlight.js/lib/languages/gradle'));\nhljs.registerLanguage('groovy', require('highlight.js/lib/languages/groovy'));\nhljs.registerLanguage('haml', require('highlight.js/lib/languages/haml'));\nhljs.registerLanguage('handlebars', require('highlight.js/lib/languages/handlebars'));\nhljs.registerLanguage('haskell', require('highlight.js/lib/languages/haskell'));\nhljs.registerLanguage('htmlbars', require('highlight.js/lib/languages/htmlbars'));\nhljs.registerLanguage('http', require('highlight.js/lib/languages/http'));\nhljs.registerLanguage('ini', require('highlight.js/lib/languages/ini'));\nhljs.registerLanguage('java', require('highlight.js/lib/languages/java'));\nhljs.registerLanguage('javascript', require('highlight.js/lib/languages/javascript'));\nhljs.registerLanguage('json', require('highlight.js/lib/languages/json'));\nhljs.registerLanguage('julia', require('highlight.js/lib/languages/julia'));\nhljs.registerLanguage('julia-repl', require('highlight.js/lib/languages/julia-repl'));\nhljs.registerLanguage('kotlin', require('highlight.js/lib/languages/kotlin'));\nhljs.registerLanguage('ldif', require('highlight.js/lib/languages/ldif'));\nhljs.registerLanguage('less', require('highlight.js/lib/languages/less'));\nhljs.registerLanguage('lisp', require('highlight.js/lib/languages/lisp'));\nhljs.registerLanguage('livescript', require('highlight.js/lib/languages/livescript'));\nhljs.registerLanguage('lua', require('highlight.js/lib/languages/lua'));\nhljs.registerLanguage('makefile', require('highlight.js/lib/languages/makefile'));\nhljs.registerLanguage('markdown', require('highlight.js/lib/languages/markdown'));\nhljs.registerLanguage('mathematica', require('highlight.js/lib/languages/mathematica'));\nhljs.registerLanguage('matlab', require('highlight.js/lib/languages/matlab'));\nhljs.registerLanguage('perl', require('highlight.js/lib/languages/perl'));\nhljs.registerLanguage('nginx', require('highlight.js/lib/languages/nginx'));\nhljs.registerLanguage('nix', require('highlight.js/lib/languages/nix'));\nhljs.registerLanguage('objectivec', require('highlight.js/lib/languages/objectivec'));\nhljs.registerLanguage('ocaml', require('highlight.js/lib/languages/ocaml'));\nhljs.registerLanguage('pgsql', require('highlight.js/lib/languages/pgsql'));\nhljs.registerLanguage('php', require('highlight.js/lib/languages/php'));\nhljs.registerLanguage('plaintext', require('highlight.js/lib/languages/plaintext'));\nhljs.registerLanguage('powershell', require('highlight.js/lib/languages/powershell'));\nhljs.registerLanguage('prolog', require('highlight.js/lib/languages/prolog'));\nhljs.registerLanguage('python', require('highlight.js/lib/languages/python'));\nhljs.registerLanguage('r', require('highlight.js/lib/languages/r'));\nhljs.registerLanguage('reasonml', require('highlight.js/lib/languages/reasonml'));\nhljs.registerLanguage('ruby', require('highlight.js/lib/languages/ruby'));\nhljs.registerLanguage('rust', require('highlight.js/lib/languages/rust'));\nhljs.registerLanguage('scala', require('highlight.js/lib/languages/scala'));\nhljs.registerLanguage('scss', require('highlight.js/lib/languages/scss'));\nhljs.registerLanguage('shell', require('highlight.js/lib/languages/shell'));\nhljs.registerLanguage('smalltalk', require('highlight.js/lib/languages/smalltalk'));\nhljs.registerLanguage('sql', require('highlight.js/lib/languages/sql'));\nhljs.registerLanguage('swift', require('highlight.js/lib/languages/swift'));\nhljs.registerLanguage('typescript', require('highlight.js/lib/languages/typescript'));\nhljs.registerLanguage('vbnet', require('highlight.js/lib/languages/vbnet'));\nhljs.registerLanguage('vbscript', require('highlight.js/lib/languages/vbscript'));\nhljs.registerLanguage('vim', require('highlight.js/lib/languages/vim'));\nhljs.registerLanguage('yaml', require('highlight.js/lib/languages/yaml'));\nhljs.registerLanguage('xml', require('highlight.js/lib/languages/xml'));\n\n// ---\n// Uncomment below to include that language in the final build\n// ---\n\n// hljs.registerLanguage('1c', require('highlight.js/lib/languages/1c'));\n// hljs.registerLanguage('abnf', require('highlight.js/lib/languages/abnf'));\n// hljs.registerLanguage('accesslog', require('highlight.js/lib/languages/accesslog'));\n// hljs.registerLanguage('ada', require('highlight.js/lib/languages/ada'));\n// hljs.registerLanguage('angelscript', require('highlight.js/lib/languages/angelscript'));\n// hljs.registerLanguage('arcade', require('highlight.js/lib/languages/arcade'));\n// hljs.registerLanguage('arduino', require('highlight.js/lib/languages/arduino'));\n// hljs.registerLanguage('armasm', require('highlight.js/lib/languages/armasm'));\n// hljs.registerLanguage('aspectj', require('highlight.js/lib/languages/aspectj'));\n// hljs.registerLanguage('autohotkey', require('highlight.js/lib/languages/autohotkey'));\n// hljs.registerLanguage('autoit', require('highlight.js/lib/languages/autoit'));\n// hljs.registerLanguage('avrasm', require('highlight.js/lib/languages/avrasm'));\n// hljs.registerLanguage('awk', require('highlight.js/lib/languages/awk'));\n// hljs.registerLanguage('axapta', require('highlight.js/lib/languages/axapta'));\n// hljs.registerLanguage('bnf', require('highlight.js/lib/languages/bnf'));\n// hljs.registerLanguage('brainfuck', require('highlight.js/lib/languages/brainfuck'));\n// hljs.registerLanguage('cal', require('highlight.js/lib/languages/cal'));\n// hljs.registerLanguage('capnproto', require('highlight.js/lib/languages/capnproto'));\n// hljs.registerLanguage('ceylon', require('highlight.js/lib/languages/ceylon'));\n// hljs.registerLanguage('clean', require('highlight.js/lib/languages/clean'));\n// hljs.registerLanguage('coq', require('highlight.js/lib/languages/coq'));\n// hljs.registerLanguage('cos', require('highlight.js/lib/languages/cos'));\n// hljs.registerLanguage('crmsh', require('highlight.js/lib/languages/crmsh'));\n// hljs.registerLanguage('cs', require('highlight.js/lib/languages/cs'));\n// hljs.registerLanguage('csp', require('highlight.js/lib/languages/csp'));\n// hljs.registerLanguage('d', require('highlight.js/lib/languages/d'));\n// hljs.registerLanguage('delphi', require('highlight.js/lib/languages/delphi'));\n// hljs.registerLanguage('dts', require('highlight.js/lib/languages/dts'));\n// hljs.registerLanguage('dust', require('highlight.js/lib/languages/dust'));\n// hljs.registerLanguage('ebnf', require('highlight.js/lib/languages/ebnf'));\n// hljs.registerLanguage('fix', require('highlight.js/lib/languages/fix'));\n// hljs.registerLanguage('flix', require('highlight.js/lib/languages/flix'));\n// hljs.registerLanguage('gams', require('highlight.js/lib/languages/gams'));\n// hljs.registerLanguage('gauss', require('highlight.js/lib/languages/gauss'));\n// hljs.registerLanguage('gcode', require('highlight.js/lib/languages/gcode'));\n// hljs.registerLanguage('glsl', require('highlight.js/lib/languages/glsl'));\n// hljs.registerLanguage('gml', require('highlight.js/lib/languages/gml'));\n// hljs.registerLanguage('golo', require('highlight.js/lib/languages/golo'));\n// hljs.registerLanguage('haxe', require('highlight.js/lib/languages/haxe'));\n// hljs.registerLanguage('hsp', require('highlight.js/lib/languages/hsp'));\n// hljs.registerLanguage('hy', require('highlight.js/lib/languages/hy'));\n// hljs.registerLanguage('inform7', require('highlight.js/lib/languages/inform7'));\n// hljs.registerLanguage('irpf90', require('highlight.js/lib/languages/irpf90'));\n// hljs.registerLanguage('isbl', require('highlight.js/lib/languages/isbl'));\n// hljs.registerLanguage('jboss-cli', require('highlight.js/lib/languages/jboss-cli'));\n// hljs.registerLanguage('lasso', require('highlight.js/lib/languages/lasso'));\n// hljs.registerLanguage('leaf', require('highlight.js/lib/languages/leaf'));\n// hljs.registerLanguage('livecodeserver', require('highlight.js/lib/languages/livecodeserver'));\n// hljs.registerLanguage('llvm', require('highlight.js/lib/languages/llvm'));\n// hljs.registerLanguage('lsl', require('highlight.js/lib/languages/lsl'));\n// hljs.registerLanguage('maxima', require('highlight.js/lib/languages/maxima'));\n// hljs.registerLanguage('mel', require('highlight.js/lib/languages/mel'));\n// hljs.registerLanguage('mercury', require('highlight.js/lib/languages/mercury'));\n// hljs.registerLanguage('mipsasm', require('highlight.js/lib/languages/mipsasm'));\n// hljs.registerLanguage('mizar', require('highlight.js/lib/languages/mizar'));\n// hljs.registerLanguage('mojolicious', require('highlight.js/lib/languages/mojolicious'));\n// hljs.registerLanguage('monkey', require('highlight.js/lib/languages/monkey'));\n// hljs.registerLanguage('moonscript', require('highlight.js/lib/languages/moonscript'));\n// hljs.registerLanguage('n1ql', require('highlight.js/lib/languages/n1ql'));\n// hljs.registerLanguage('nimrod', require('highlight.js/lib/languages/nimrod'));\n// hljs.registerLanguage('nsis', require('highlight.js/lib/languages/nsis'));\n// hljs.registerLanguage('openscad', require('highlight.js/lib/languages/openscad'));\n// hljs.registerLanguage('oxygene', require('highlight.js/lib/languages/oxygene'));\n// hljs.registerLanguage('parser3', require('highlight.js/lib/languages/parser3'));\n// hljs.registerLanguage('pf', require('highlight.js/lib/languages/pf'));\n// hljs.registerLanguage('pony', require('highlight.js/lib/languages/pony'));\n// hljs.registerLanguage('processing', require('highlight.js/lib/languages/processing'));\n// hljs.registerLanguage('profile', require('highlight.js/lib/languages/profile'));\n// hljs.registerLanguage('properties', require('highlight.js/lib/languages/properties'));\n// hljs.registerLanguage('protobuf', require('highlight.js/lib/languages/protobuf'));\n// hljs.registerLanguage('puppet', require('highlight.js/lib/languages/puppet'));\n// hljs.registerLanguage('purebasic', require('highlight.js/lib/languages/purebasic'));\n// hljs.registerLanguage('q', require('highlight.js/lib/languages/q'));\n// hljs.registerLanguage('qml', require('highlight.js/lib/languages/qml'));\n// hljs.registerLanguage('rib', require('highlight.js/lib/languages/rib'));\n// hljs.registerLanguage('roboconf', require('highlight.js/lib/languages/roboconf'));\n// hljs.registerLanguage('routeros', require('highlight.js/lib/languages/routeros'));\n// hljs.registerLanguage('rsl', require('highlight.js/lib/languages/rsl'));\n// hljs.registerLanguage('ruleslanguage', require('highlight.js/lib/languages/ruleslanguage'));\n// hljs.registerLanguage('sas', require('highlight.js/lib/languages/sas'));\n// hljs.registerLanguage('scheme', require('highlight.js/lib/languages/scheme'));\n// hljs.registerLanguage('scilab', require('highlight.js/lib/languages/scilab'));\n// hljs.registerLanguage('smali', require('highlight.js/lib/languages/smali'));\n// hljs.registerLanguage('sml', require('highlight.js/lib/languages/sml'));\n// hljs.registerLanguage('sqf', require('highlight.js/lib/languages/sqf'));\n// hljs.registerLanguage('stan', require('highlight.js/lib/languages/stan'));\n// hljs.registerLanguage('stata', require('highlight.js/lib/languages/stata'));\n// hljs.registerLanguage('step21', require('highlight.js/lib/languages/step21'));\n// hljs.registerLanguage('stylus', require('highlight.js/lib/languages/stylus'));\n// hljs.registerLanguage('subunit', require('highlight.js/lib/languages/subunit'));\n// hljs.registerLanguage('taggerscript', require('highlight.js/lib/languages/taggerscript'));\n// hljs.registerLanguage('tap', require('highlight.js/lib/languages/tap'));\n// hljs.registerLanguage('tcl', require('highlight.js/lib/languages/tcl'));\n// hljs.registerLanguage('tex', require('highlight.js/lib/languages/tex'));\n// hljs.registerLanguage('thrift', require('highlight.js/lib/languages/thrift'));\n// hljs.registerLanguage('tp', require('highlight.js/lib/languages/tp'));\n// hljs.registerLanguage('twig', require('highlight.js/lib/languages/twig'));\n// hljs.registerLanguage('vala', require('highlight.js/lib/languages/vala'));\n// hljs.registerLanguage('vbscript-html', require('highlight.js/lib/languages/vbscript-html'));\n// hljs.registerLanguage('verilog', require('highlight.js/lib/languages/verilog'));\n// hljs.registerLanguage('vhdl', require('highlight.js/lib/languages/vhdl'));\n// hljs.registerLanguage('x86asm', require('highlight.js/lib/languages/x86asm'));\n// hljs.registerLanguage('xl', require('highlight.js/lib/languages/xl'));\n// hljs.registerLanguage('xquery', require('highlight.js/lib/languages/xquery'));\n// hljs.registerLanguage('zephir', require('highlight.js/lib/languages/zephir'));\n\nexport default hljs;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport SimpleMDE from 'simplemde';\nimport hljs from '../utils/highlighter';\nimport FilePicker from './FilePicker';\nimport { getExtensionFromPath } from '../utils/helpers';\n\nconst classNames = [\n 'editor-toolbar',\n 'CodeMirror',\n 'editor-preview-side',\n 'editor-statusbar',\n];\n\nclass MarkdownEditor extends Component {\n componentDidMount() {\n this.create();\n window.hljs = hljs; // TODO: fix this after the next release of SimpleMDE\n }\n\n shouldComponentUpdate(nextProps) {\n return nextProps.initialValue !== this.props.initialValue;\n }\n\n componentDidUpdate() {\n this.destroy();\n this.create();\n }\n\n componentWillUnmount() {\n this.destroy();\n }\n\n create() {\n const { onChange, onSave } = this.props;\n let opts = Object.create(this.props);\n opts['element'] = this.refs.text;\n opts['autoDownloadFontAwesome'] = false;\n opts['spellChecker'] = false;\n opts['renderingConfig'] = {\n codeSyntaxHighlighting: true,\n };\n opts['insertTexts'] = {\n image: [''],\n };\n let toolbarIcons = [\n 'bold',\n 'italic',\n 'heading',\n '|',\n 'code',\n 'quote',\n 'unordered-list',\n 'ordered-list',\n '|',\n 'link',\n 'image',\n 'table',\n {\n name: 'filepicker',\n action: () => this.refs.filepicker.refs.trigger.click(),\n className: 'fa fa-paperclip',\n title: 'Insert Static File',\n },\n '|',\n 'preview',\n 'side-by-side',\n 'fullscreen',\n '|',\n ];\n if (onSave) {\n toolbarIcons.push({\n name: 'save',\n action: onSave,\n className: 'fa fa-floppy-o',\n title: 'Save',\n });\n }\n opts['toolbar'] = toolbarIcons;\n const editor = new SimpleMDE(opts);\n if (editor.codemirror) {\n editor.codemirror.on('change', () => {\n onChange(editor.value());\n });\n }\n this.editor = editor;\n }\n\n destroy() {\n for (let i in classNames) {\n let elementToRemove = this.refs.container.querySelector(\n '.' + classNames[i]\n );\n elementToRemove && elementToRemove.remove();\n }\n }\n\n // Adapted from an internal helper function within SimpleMDE package.\n _replaceSelectedText = (cm, headNTail, url) => {\n const startPoint = cm.getCursor('start');\n const endPoint = cm.getCursor('end');\n const text = cm.getSelection();\n\n let [head, tail] = headNTail;\n if (url) {\n tail = tail.replace('#url#', url);\n }\n\n cm.replaceSelection(`${head}${text}${tail}`);\n startPoint.ch += head.length;\n\n if (startPoint !== endPoint) {\n endPoint.ch += head.length;\n }\n\n cm.setSelection(startPoint, endPoint);\n cm.focus();\n };\n\n handleFilePick = path => {\n const { codemirror, options } = this.editor;\n const { image, link } = options.insertTexts;\n const url = `{{ '${path}' | relative_url }}`;\n const ext = getExtensionFromPath(path);\n\n const type = /png|jpg|gif|jpeg|svg|ico/i.test(ext) ? image : link;\n this._replaceSelectedText(codemirror, type, url);\n };\n\n render() {\n return (\n <div>\n <div style={{ display: 'none' }}>\n <FilePicker ref=\"filepicker\" onPick={this.handleFilePick} />\n </div>\n <div ref=\"container\">\n <textarea ref=\"text\" />\n </div>\n </div>\n );\n }\n}\n\nMarkdownEditor.propTypes = {\n initialValue: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n onSave: PropTypes.func.isRequired,\n};\n\nexport default MarkdownEditor;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Splitter from './Splitter';\nimport InputPath from './form/InputPath';\nimport InputTitle from './form/InputTitle';\nimport MarkdownEditor from './MarkdownEditor';\nimport Metadata from '../containers/MetaFields';\n\nexport default function MarkdownPageBody({\n type,\n path,\n body,\n title,\n onSave,\n updateTitle,\n updatePath,\n updateBody,\n metafields,\n staticmetafields,\n}) {\n return (\n <div className=\"content-body\">\n <InputPath onChange={updatePath} type={type} path={path} />\n <InputTitle onChange={updateTitle} title={title} />\n <MarkdownEditor\n onChange={updateBody}\n onSave={onSave}\n placeholder=\"Body\"\n initialValue={body}\n />\n <Splitter />\n <Metadata fields={metafields} staticFields={staticmetafields} />\n </div>\n );\n}\n\nMarkdownPageBody.defaultProps = {\n path: '',\n body: '',\n title: '',\n metafields: {},\n staticmetafields: {},\n};\n\nMarkdownPageBody.propTypes = {\n updateBody: PropTypes.func.isRequired,\n updatePath: PropTypes.func.isRequired,\n updateTitle: PropTypes.func.isRequired,\n onSave: PropTypes.func.isRequired,\n type: PropTypes.string.isRequired,\n path: PropTypes.string,\n body: PropTypes.string,\n title: PropTypes.string,\n metafields: PropTypes.object,\n staticmetafields: PropTypes.object,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { browserHistory, withRouter } from 'react-router';\nimport { HotKeys } from 'react-hotkeys';\nimport _ from 'underscore';\nimport DocumentTitle from 'react-document-title';\nimport Button from '../../components/Button';\nimport Errors from '../../components/Errors';\nimport Splitter from '../../components/Splitter';\nimport Breadcrumbs from '../../components/Breadcrumbs';\nimport MarkdownPageBody from '../../components/MarkdownPageBody';\nimport { fetchPage, deletePage, putPage } from '../../ducks/pages';\nimport { updateTitle, updateBody, updatePath } from '../../ducks/metadata';\nimport { clearErrors } from '../../ducks/utils';\nimport { preventDefault, getDocumentTitle } from '../../utils/helpers';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getLeaveMessage, getDeleteMessage } = translations;\n\nexport class PageEdit extends Component {\n componentDidMount() {\n const { fetchPage, params, router, route } = this.props;\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n fetchPage(directory, filename);\n\n router.setRouteLeaveHook(route, this.routerWillLeave);\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.updated !== nextProps.updated) {\n const new_path = nextProps.page.path;\n const path = this.props.page.path;\n // redirect if the path is changed\n if (new_path !== path) {\n browserHistory.push(`${ADMIN_PREFIX}/pages/${new_path}`);\n }\n }\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n if (this.props.fieldChanged) {\n return getLeaveMessage();\n }\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const { putPage, fieldChanged, params } = this.props;\n if (fieldChanged) {\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n putPage(directory, filename);\n }\n };\n\n handleClickDelete(name) {\n const { deletePage, params } = this.props;\n const confirm = window.confirm(getDeleteMessage(name));\n if (confirm) {\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n deletePage(directory, filename);\n browserHistory.push(`${ADMIN_PREFIX}/pages/${directory || ''}`);\n }\n }\n\n render() {\n const {\n isFetching,\n page,\n errors,\n updateTitle,\n updateBody,\n updatePath,\n updated,\n fieldChanged,\n params,\n } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n if (_.isEmpty(page)) {\n return <h1>{`Could not find the page.`}</h1>;\n }\n\n const keyboardHandlers = {\n save: this.handleClickSave,\n };\n\n const {\n name,\n raw_content,\n http_url,\n front_matter,\n front_matter_defaults,\n } = page;\n const directory = params.splat[0];\n\n const title = front_matter && front_matter.title ? front_matter.title : '';\n const document_title = getDocumentTitle('pages', directory, title || name);\n\n return (\n <DocumentTitle title={document_title}>\n <HotKeys handlers={keyboardHandlers} className=\"single\">\n {errors.length > 0 && <Errors errors={errors} />}\n\n <div className=\"content-header\">\n <Breadcrumbs type=\"pages\" splat={directory} />\n </div>\n\n <div className=\"content-wrapper\">\n <MarkdownPageBody\n type=\"pages\"\n updateTitle={updateTitle}\n updatePath={updatePath}\n updateBody={updateBody}\n onSave={this.handleClickSave}\n path={name}\n title={title}\n body={raw_content}\n metafields={{ title, raw_content, path: name, ...front_matter }}\n staticmetafields={front_matter_defaults}\n />\n <div className=\"content-side\">\n <Button\n onClick={this.handleClickSave}\n type=\"save\"\n active={fieldChanged}\n triggered={updated}\n block\n />\n <Button to={http_url} type=\"view\" active block />\n <Splitter />\n <Button\n onClick={() => this.handleClickDelete(name)}\n type=\"delete\"\n active\n block\n />\n </div>\n </div>\n </HotKeys>\n </DocumentTitle>\n );\n }\n}\n\nPageEdit.propTypes = {\n page: PropTypes.object.isRequired,\n fetchPage: PropTypes.func.isRequired,\n deletePage: PropTypes.func.isRequired,\n putPage: PropTypes.func.isRequired,\n updateTitle: PropTypes.func.isRequired,\n updateBody: PropTypes.func.isRequired,\n updatePath: PropTypes.func.isRequired,\n clearErrors: PropTypes.func.isRequired,\n isFetching: PropTypes.bool.isRequired,\n errors: PropTypes.array.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n updated: PropTypes.bool.isRequired,\n params: PropTypes.object.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n page: state.pages.page,\n isFetching: state.pages.isFetching,\n fieldChanged: state.metadata.fieldChanged,\n updated: state.pages.updated,\n errors: state.utils.errors,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchPage,\n deletePage,\n putPage,\n updateTitle,\n updateBody,\n updatePath,\n clearErrors,\n },\n dispatch\n );\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(PageEdit)\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { HotKeys } from 'react-hotkeys';\nimport Button from './Button';\nimport Errors from './Errors';\nimport Breadcrumbs from './Breadcrumbs';\nimport MarkdownPageBody from './MarkdownPageBody';\nimport { injectDefaultFields as defaultFields } from '../utils/metadata';\n\nexport default function CreateMarkdownPage({\n type,\n config,\n errors,\n updated,\n updateBody,\n updatePath,\n updateTitle,\n fieldChanged,\n onClickSave,\n params: { splat },\n}) {\n const metaType = type === 'drafts' ? 'posts' : type;\n\n return (\n <HotKeys handlers={{ save: onClickSave }}>\n {errors.length > 0 && <Errors errors={errors} />}\n\n <div className=\"content-header\">\n <Breadcrumbs type={type} splat={splat} />\n </div>\n\n <div className=\"content-wrapper\">\n <MarkdownPageBody\n type={type}\n updatePath={updatePath}\n updateTitle={updateTitle}\n updateBody={updateBody}\n onSave={onClickSave}\n staticmetafields={defaultFields(config, splat, metaType)}\n />\n <div className=\"content-side\">\n <Button\n onClick={onClickSave}\n type=\"create\"\n active={fieldChanged}\n triggered={updated}\n block\n />\n </div>\n </div>\n </HotKeys>\n );\n}\n\nCreateMarkdownPage.propTypes = {\n type: PropTypes.string.isRequired,\n config: PropTypes.object.isRequired,\n params: PropTypes.object.isRequired,\n errors: PropTypes.array.isRequired,\n updated: PropTypes.bool.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n updateBody: PropTypes.func.isRequired,\n updatePath: PropTypes.func.isRequired,\n updateTitle: PropTypes.func.isRequired,\n onClickSave: PropTypes.func.isRequired,\n};\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { browserHistory, withRouter } from 'react-router';\nimport DocumentTitle from 'react-document-title';\nimport CreateMarkdownPage from '../../components/CreateMarkdownPage';\nimport { updateTitle, updateBody, updatePath } from '../../ducks/metadata';\nimport { createPage } from '../../ducks/pages';\nimport { clearErrors } from '../../ducks/utils';\nimport { preventDefault, getDocumentTitle } from '../../utils/helpers';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getLeaveMessage } = translations;\n\nexport class PageNew extends Component {\n componentDidMount() {\n const { router, route } = this.props;\n router.setRouteLeaveHook(route, this.routerWillLeave);\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.updated !== nextProps.updated) {\n browserHistory.push(`${ADMIN_PREFIX}/pages/${nextProps.page.path}`);\n }\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n if (this.props.fieldChanged) {\n return getLeaveMessage();\n }\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const { fieldChanged, createPage, params } = this.props;\n fieldChanged && createPage(params.splat);\n };\n\n render() {\n const {\n params,\n config,\n errors,\n updated,\n updateBody,\n updatePath,\n updateTitle,\n fieldChanged,\n } = this.props;\n\n const title = getDocumentTitle('pages', params.splat, 'New page');\n\n return (\n <DocumentTitle title={title}>\n <CreateMarkdownPage\n type=\"pages\"\n params={params}\n config={config}\n errors={errors}\n updated={updated}\n updateBody={updateBody}\n updatePath={updatePath}\n updateTitle={updateTitle}\n fieldChanged={fieldChanged}\n onClickSave={this.handleClickSave}\n />\n </DocumentTitle>\n );\n }\n}\n\nPageNew.propTypes = {\n createPage: PropTypes.func.isRequired,\n updateTitle: PropTypes.func.isRequired,\n updateBody: PropTypes.func.isRequired,\n updatePath: PropTypes.func.isRequired,\n clearErrors: PropTypes.func.isRequired,\n errors: PropTypes.array.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n updated: PropTypes.bool.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n params: PropTypes.object.isRequired,\n config: PropTypes.object.isRequired,\n page: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n page: state.pages.page,\n fieldChanged: state.metadata.fieldChanged,\n errors: state.utils.errors,\n updated: state.pages.updated,\n config: state.config.config,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n updateTitle,\n updateBody,\n updatePath,\n createPage,\n clearErrors,\n },\n dispatch\n );\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(PageNew)\n);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport _ from 'underscore';\nimport moment from 'moment';\nimport DocumentTitle from 'react-document-title';\nimport InputSearch from '../../components/form/InputSearch';\nimport Breadcrumbs from '../../components/Breadcrumbs';\nimport Button from '../../components/Button';\nimport Icon from '../../components/Icon';\nimport {\n fetchCollection,\n deleteDocument,\n filterBySearchInput,\n} from '../../ducks/collections';\nimport { search } from '../../ducks/utils';\nimport { getDocumentTitle } from '../../utils/helpers';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getDeleteMessage, getNotFoundMessage } = translations;\n\nexport class Documents extends Component {\n componentDidMount() {\n const { fetchCollection, params } = this.props;\n fetchCollection(params.collection_name, params.splat);\n }\n\n componentWillReceiveProps(nextProps) {\n const { fetchCollection, params } = nextProps;\n // refetch the collection when navigating between collections or when splat is changed\n if (\n params.splat !== this.props.params.splat ||\n params.collection_name !== this.props.params.collection_name\n ) {\n fetchCollection(params.collection_name, params.splat);\n }\n }\n\n handleClickDelete(filename) {\n const { deleteDocument, params } = this.props;\n const confirm = window.confirm(getDeleteMessage(filename));\n confirm && deleteDocument(params.collection_name, params.splat, filename);\n }\n\n renderTable() {\n return (\n <div className=\"content-table\">\n <table>\n <thead>\n <tr>\n <th>Name</th>\n <th>Date</th>\n <th className=\"th-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>{this.renderRows()}</tbody>\n </table>\n </div>\n );\n }\n\n renderFileRow(doc) {\n const { id, name, title, http_url, collection, relative_path } = doc;\n const to = `${ADMIN_PREFIX}/collections/${collection}/${relative_path}`;\n // date w/o timezone\n let date = doc.date.substring(0, doc.date.lastIndexOf(' '));\n date =\n moment(date).format('hh:mm:ss') === '12:00:00'\n ? moment(date).format('ll')\n : moment(date).format('lll');\n\n return (\n <tr key={id}>\n <td className=\"row-title\">\n <strong>\n <Link to={to}>\n <Icon name=\"file-text-o\" />\n {title || name}\n </Link>\n </strong>\n </td>\n <td>{date}</td>\n <td>\n <div className=\"row-actions\">\n <Button\n onClick={() => this.handleClickDelete(name)}\n type=\"delete\"\n active\n thin\n />\n {http_url && <Button to={http_url} type=\"view\" active thin />}\n </div>\n </td>\n </tr>\n );\n }\n\n renderDirectoryRow(directory) {\n const { params: { collection_name } } = this.props;\n const { name, relative_path, modified_time } = directory;\n const to = `${ADMIN_PREFIX}/collections/${collection_name}/${relative_path}`;\n // date w/o timezone\n let date = modified_time.substring(0, modified_time.lastIndexOf(' '));\n date = moment(date).format('ll');\n return (\n <tr key={name}>\n <td className=\"row-title\">\n <strong>\n <Link to={to}>\n <Icon name=\"folder\" />\n {name}\n </Link>\n </strong>\n </td>\n <td>{date}</td>\n <td />\n </tr>\n );\n }\n\n renderRows() {\n const { documents } = this.props;\n return _.map(documents, entry => {\n if (entry.type && entry.type === 'directory') {\n return this.renderDirectoryRow(entry);\n } else {\n return this.renderFileRow(entry);\n }\n });\n }\n\n render() {\n const { isFetching, documents, search, params } = this.props;\n const { collection_name } = params;\n\n if (isFetching) {\n return null;\n }\n\n const splat = params.splat || '';\n const to = params.splat\n ? `${ADMIN_PREFIX}/collections/${collection_name}/${splat}/new`\n : `${ADMIN_PREFIX}/collections/${collection_name}/new`;\n\n const document_title = getDocumentTitle(collection_name, params.splat);\n\n return (\n <DocumentTitle title={document_title}>\n <div>\n <div className=\"content-header\">\n <Breadcrumbs type={collection_name} splat={splat} />\n <div className=\"page-buttons\">\n <Link className=\"btn btn-active\" to={to}>\n {collection_name === 'posts' ? 'New post' : 'New document'}\n </Link>\n </div>\n <div className=\"pull-right\">\n <InputSearch searchBy=\"title\" search={search} />\n </div>\n </div>\n {documents.length > 0 && this.renderTable()}\n {!documents.length && <h1>{getNotFoundMessage('documents')}</h1>}\n </div>\n </DocumentTitle>\n );\n }\n}\n\nDocuments.propTypes = {\n isFetching: PropTypes.bool.isRequired,\n documents: PropTypes.array.isRequired,\n fetchCollection: PropTypes.func.isRequired,\n deleteDocument: PropTypes.func.isRequired,\n search: PropTypes.func.isRequired,\n params: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n documents: filterBySearchInput(state.collections.entries, state.utils.input),\n isFetching: state.collections.isFetching,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchCollection,\n deleteDocument,\n search,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Documents);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { browserHistory, withRouter } from 'react-router';\nimport { HotKeys } from 'react-hotkeys';\nimport _ from 'underscore';\nimport DocumentTitle from 'react-document-title';\nimport Button from '../../components/Button';\nimport Errors from '../../components/Errors';\nimport Splitter from '../../components/Splitter';\nimport Breadcrumbs from '../../components/Breadcrumbs';\nimport MarkdownPageBody from '../../components/MarkdownPageBody';\nimport {\n fetchDocument,\n deleteDocument,\n putDocument,\n} from '../../ducks/collections';\nimport { updateTitle, updateBody, updatePath } from '../../ducks/metadata';\nimport { clearErrors } from '../../ducks/utils';\nimport { preventDefault, getDocumentTitle } from '../../utils/helpers';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getLeaveMessage, getDeleteMessage, getNotFoundMessage } = translations;\n\nexport class DocumentEdit extends Component {\n componentDidMount() {\n const { fetchDocument, params, router, route } = this.props;\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n fetchDocument(params.collection_name, directory, filename);\n router.setRouteLeaveHook(route, this.routerWillLeave);\n }\n\n componentWillReceiveProps(nextProps) {\n const { currentDocument } = this.props;\n if (this.props.updated !== nextProps.updated) {\n const new_path = nextProps.currentDocument.path;\n const path = currentDocument.path;\n // redirect if the path is changed\n if (new_path !== path) {\n browserHistory.push(\n `${ADMIN_PREFIX}/collections/${new_path.substring(1)}` // remove `_`\n );\n }\n }\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n if (this.props.fieldChanged) {\n return getLeaveMessage();\n }\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const { putDocument, fieldChanged, params } = this.props;\n if (fieldChanged) {\n const collection = params.collection_name;\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n putDocument(collection, directory, filename);\n }\n };\n\n handleClickDelete = () => {\n const { deleteDocument, params } = this.props;\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n const confirm = window.confirm(getDeleteMessage(filename));\n if (confirm) {\n const collection = params.collection_name;\n deleteDocument(collection, directory, filename);\n browserHistory.push(\n `${ADMIN_PREFIX}/collections/${collection}/${directory || ''}`\n );\n }\n };\n\n render() {\n const {\n isFetching,\n currentDocument,\n errors,\n updateTitle,\n updateBody,\n updatePath,\n updated,\n fieldChanged,\n params,\n } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n if (_.isEmpty(currentDocument)) {\n return <h1>{getNotFoundMessage('document')}</h1>;\n }\n\n const {\n title,\n raw_content,\n http_url,\n collection,\n front_matter,\n front_matter_defaults,\n name,\n } = currentDocument;\n const directory = params.splat[0];\n\n const keyboardHandlers = {\n save: this.handleClickSave,\n };\n\n const document_title = getDocumentTitle(collection, directory, title);\n\n return (\n <DocumentTitle title={document_title}>\n <HotKeys handlers={keyboardHandlers} className=\"single\">\n {errors.length > 0 && <Errors errors={errors} />}\n\n <div className=\"content-header\">\n <Breadcrumbs type={collection} splat={directory} />\n </div>\n\n <div className=\"content-wrapper\">\n <MarkdownPageBody\n type={collection}\n path={name}\n title={title}\n body={raw_content}\n updatePath={updatePath}\n updateTitle={updateTitle}\n updateBody={updateBody}\n onSave={this.handleClickSave}\n metafields={{ title, path: name, raw_content, ...front_matter }}\n staticmetafields={front_matter_defaults}\n />\n <div className=\"content-side\">\n <Button\n onClick={this.handleClickSave}\n type=\"save\"\n active={fieldChanged}\n triggered={updated}\n block\n />\n <Button to={http_url} type=\"view\" active block />\n <Splitter />\n <Button\n onClick={this.handleClickDelete}\n type=\"delete\"\n active\n block\n />\n </div>\n </div>\n </HotKeys>\n </DocumentTitle>\n );\n }\n}\n\nDocumentEdit.propTypes = {\n currentDocument: PropTypes.object.isRequired,\n fetchDocument: PropTypes.func.isRequired,\n deleteDocument: PropTypes.func.isRequired,\n putDocument: PropTypes.func.isRequired,\n updateTitle: PropTypes.func.isRequired,\n updateBody: PropTypes.func.isRequired,\n updatePath: PropTypes.func.isRequired,\n clearErrors: PropTypes.func.isRequired,\n isFetching: PropTypes.bool.isRequired,\n errors: PropTypes.array.isRequired,\n updated: PropTypes.bool.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n params: PropTypes.object.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n currentDocument: state.collections.currentDocument,\n isFetching: state.collections.isFetching,\n fieldChanged: state.metadata.fieldChanged,\n updated: state.collections.updated,\n errors: state.utils.errors,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchDocument,\n deleteDocument,\n putDocument,\n updateTitle,\n updateBody,\n updatePath,\n clearErrors,\n },\n dispatch\n );\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(DocumentEdit)\n);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { browserHistory, withRouter } from 'react-router';\nimport DocumentTitle from 'react-document-title';\nimport CreateMarkdownPage from '../../components/CreateMarkdownPage';\nimport { updateTitle, updateBody, updatePath } from '../../ducks/metadata';\nimport { createDocument } from '../../ducks/collections';\nimport { clearErrors } from '../../ducks/utils';\nimport { preventDefault, getDocumentTitle } from '../../utils/helpers';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getLeaveMessage } = translations;\n\nexport class DocumentNew extends Component {\n componentDidMount() {\n const { router, route } = this.props;\n router.setRouteLeaveHook(route, this.routerWillLeave);\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.updated !== nextProps.updated) {\n const path = nextProps.currentDocument.path;\n const splat = path.substr(path.indexOf('/') + 1, path.length);\n browserHistory.push(\n `${ADMIN_PREFIX}/collections/${nextProps.currentDocument.collection}/${splat}`\n );\n }\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n if (this.props.fieldChanged) {\n return getLeaveMessage();\n }\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const { fieldChanged, createDocument, params } = this.props;\n fieldChanged && createDocument(params.collection_name, params.splat);\n };\n\n render() {\n const {\n params,\n config,\n errors,\n updated,\n updateBody,\n updatePath,\n updateTitle,\n fieldChanged,\n } = this.props;\n\n const collection = params.collection_name;\n const title = getDocumentTitle(collection, params.splat, 'New document');\n\n return (\n <DocumentTitle title={title}>\n <CreateMarkdownPage\n type={collection}\n params={params}\n config={config}\n errors={errors}\n updated={updated}\n updateBody={updateBody}\n updatePath={updatePath}\n updateTitle={updateTitle}\n fieldChanged={fieldChanged}\n onClickSave={this.handleClickSave}\n />\n </DocumentTitle>\n );\n }\n}\n\nDocumentNew.propTypes = {\n createDocument: PropTypes.func.isRequired,\n updateTitle: PropTypes.func.isRequired,\n updateBody: PropTypes.func.isRequired,\n updatePath: PropTypes.func.isRequired,\n clearErrors: PropTypes.func.isRequired,\n errors: PropTypes.array.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n updated: PropTypes.bool.isRequired,\n params: PropTypes.object.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n config: PropTypes.object.isRequired,\n currentDocument: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n currentDocument: state.collections.currentDocument,\n fieldChanged: state.metadata.fieldChanged,\n errors: state.utils.errors,\n updated: state.collections.updated,\n config: state.config.config,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n updateTitle,\n updateBody,\n updatePath,\n createDocument,\n clearErrors,\n },\n dispatch\n );\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(DocumentNew)\n);\n","import { clearErrors, validationError, filterDeleted } from './utils';\nimport { get, put, del } from '../utils/fetch';\nimport { datafilesAPIUrl, datafileAPIUrl } from '../constants/api';\nimport {\n toYAML,\n trimObject,\n computeRelativePath,\n getExtensionFromPath,\n} from '../utils/helpers';\nimport { validator } from '../utils/validation';\n\nimport translations from '../translations';\nconst { getContentRequiredMessage, getFilenameRequiredMessage } = translations;\n\n// Action Types\nexport const FETCH_DATAFILES_REQUEST = 'FETCH_DATAFILES_REQUEST';\nexport const FETCH_DATAFILES_SUCCESS = 'FETCH_DATAFILES_SUCCESS';\nexport const FETCH_DATAFILES_FAILURE = 'FETCH_DATAFILES_FAILURE';\nexport const FETCH_DATAFILE_REQUEST = 'FETCH_DATAFILE_REQUEST';\nexport const FETCH_DATAFILE_SUCCESS = 'FETCH_DATAFILE_SUCCESS';\nexport const FETCH_DATAFILE_FAILURE = 'FETCH_DATAFILE_FAILURE';\nexport const PUT_DATAFILE_REQUEST = 'PUT_DATAFILE_REQUEST';\nexport const PUT_DATAFILE_SUCCESS = 'PUT_DATAFILE_SUCCESS';\nexport const PUT_DATAFILE_FAILURE = 'PUT_DATAFILE_FAILURE';\nexport const DELETE_DATAFILE_REQUEST = 'DELETE_DATAFILE_REQUEST';\nexport const DELETE_DATAFILE_SUCCESS = 'DELETE_DATAFILE_SUCCESS';\nexport const DELETE_DATAFILE_FAILURE = 'DELETE_DATAFILE_FAILURE';\nexport const DATAFILE_CHANGED = 'DATAFILE_CHANGED';\n\n// Actions\nexport const fetchDataFiles = (directory = '') => dispatch => {\n dispatch({ type: FETCH_DATAFILES_REQUEST });\n return get(\n datafilesAPIUrl(directory),\n { type: FETCH_DATAFILES_SUCCESS, name: 'files' },\n { type: FETCH_DATAFILES_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const fetchDataFile = (directory, filename) => dispatch => {\n dispatch({ type: FETCH_DATAFILE_REQUEST });\n return get(\n datafileAPIUrl(directory, filename),\n { type: FETCH_DATAFILE_SUCCESS, name: 'file' },\n { type: FETCH_DATAFILE_FAILURE, name: 'error' },\n dispatch\n );\n};\n\n/**\n * Creates and updates a data file.\n * @param {String} directory : Dirname of data file\n * @param {String} filename : The data file\n * @param {Object} data : Content to be written to data file\n * @param {String} new_path : File path relative to config['source']\n * @param {String} source : Point of origin of file-content data.\n * Either the default `#brace-editor`, or `<DataGUI/>`\n */\nexport const putDataFile = (\n directory,\n filename,\n data,\n new_path = '',\n source = 'editor'\n) => (dispatch, getState) => {\n const ext = getExtensionFromPath(new_path || filename);\n\n if (source === 'gui') {\n const json = /json/i.test(ext);\n let metadata = getState().metadata.metadata;\n metadata = trimObject(metadata);\n data = json ? JSON.stringify(metadata, null, 2) : toYAML(metadata);\n }\n\n const payload = new_path\n ? { path: new_path, raw_content: data }\n : { raw_content: data };\n\n // handle errors\n const errors = validateDatafile(filename, data);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n dispatch(clearErrors());\n\n return put(\n datafileAPIUrl(directory, filename),\n JSON.stringify(payload),\n { type: PUT_DATAFILE_SUCCESS, name: 'file' },\n { type: PUT_DATAFILE_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const deleteDataFile = (directory, filename) => dispatch => {\n const relative_path = computeRelativePath(directory, filename);\n return del(\n datafileAPIUrl(directory, filename),\n { type: DELETE_DATAFILE_SUCCESS, name: 'file', id: relative_path },\n { type: DELETE_DATAFILE_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const onDataFileChanged = () => ({\n type: DATAFILE_CHANGED,\n});\n\nconst validateDatafile = (filename, data) =>\n validator(\n { filename, data },\n { filename: 'required', data: 'required' },\n {\n 'filename.required': getFilenameRequiredMessage(),\n 'data.required': getContentRequiredMessage(),\n }\n );\n\n// Reducer\nexport default function datafiles(\n state = {\n files: [],\n currentFile: {},\n isFetching: false,\n updated: false,\n datafileChanged: false,\n fieldChanged: false,\n },\n action\n) {\n switch (action.type) {\n case FETCH_DATAFILES_REQUEST:\n case FETCH_DATAFILE_REQUEST:\n return {\n ...state,\n isFetching: true,\n };\n case FETCH_DATAFILES_SUCCESS:\n return {\n ...state,\n files: action.files,\n isFetching: false,\n currentFile: {},\n };\n case FETCH_DATAFILES_FAILURE:\n return {\n ...state,\n isFetching: false,\n currentFile: {},\n };\n case FETCH_DATAFILE_SUCCESS:\n return {\n ...state,\n currentFile: action.file,\n isFetching: false,\n };\n case FETCH_DATAFILE_FAILURE:\n return {\n ...state,\n currentFile: {},\n isFetching: false,\n };\n case PUT_DATAFILE_SUCCESS:\n return {\n ...state,\n currentFile: action.file,\n updated: true,\n datafileChanged: false,\n };\n case PUT_DATAFILE_FAILURE:\n return {\n ...state,\n datafileChanged: false,\n };\n case DELETE_DATAFILE_SUCCESS:\n return {\n ...state,\n files: filterDeleted(state.files, action.id),\n };\n case DATAFILE_CHANGED:\n return {\n ...state,\n datafileChanged: true,\n updated: false,\n };\n default:\n return {\n ...state,\n updated: false,\n datafileChanged: false,\n };\n }\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport DocumentTitle from 'react-document-title';\nimport Explorer from '../../components/Explorer';\nimport { search, filterBySearchInput } from '../../ducks/utils';\nimport { fetchDataFiles, deleteDataFile } from '../../ducks/datafiles';\nimport { getDocumentTitle } from '../../utils/helpers';\n\nexport class DataFiles extends Component {\n componentDidMount() {\n const { fetchDataFiles, params } = this.props;\n fetchDataFiles(params.splat);\n }\n\n componentWillReceiveProps(nextProps) {\n const { fetchDataFiles } = nextProps;\n if (this.props.params.splat !== nextProps.params.splat) {\n fetchDataFiles(nextProps.params.splat);\n }\n }\n\n render() {\n const { isFetching, files, search, params, deleteDataFile } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n const title = getDocumentTitle('data files', params.splat);\n\n return (\n <DocumentTitle title={title}>\n <Explorer\n type=\"datafiles\"\n items={files}\n params={params}\n newBtnLabel=\"New data file\"\n search={search}\n deleteItem={deleteDataFile}\n />\n </DocumentTitle>\n );\n }\n}\n\nDataFiles.propTypes = {\n files: PropTypes.array.isRequired,\n fetchDataFiles: PropTypes.func.isRequired,\n deleteDataFile: PropTypes.func.isRequired,\n isFetching: PropTypes.bool.isRequired,\n search: PropTypes.func.isRequired,\n params: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n files: filterBySearchInput(state.datafiles.files, state.utils.input),\n isFetching: state.datafiles.isFetching,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchDataFiles,\n deleteDataFile,\n search,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DataFiles);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { browserHistory, withRouter } from 'react-router';\nimport _ from 'underscore';\nimport { HotKeys } from 'react-hotkeys';\nimport DocumentTitle from 'react-document-title';\nimport DataGUI from '../../components/DataGUI';\nimport Breadcrumbs from '../../components/Breadcrumbs';\nimport InputPath from '../../components/form/InputPath';\nimport Splitter from '../../components/Splitter';\nimport Errors from '../../components/Errors';\nimport Editor from '../../components/Editor';\nimport Button from '../../components/Button';\nimport { clearErrors } from '../../ducks/utils';\nimport {\n getFilenameFromPath,\n getExtensionFromPath,\n preventDefault,\n getDocumentTitle,\n} from '../../utils/helpers';\nimport {\n fetchDataFile,\n putDataFile,\n deleteDataFile,\n onDataFileChanged,\n} from '../../ducks/datafiles';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getLeaveMessage, getDeleteMessage, getNotFoundMessage } = translations;\n\nexport class DataFileEdit extends Component {\n state = {\n guiView: false,\n };\n\n componentDidMount() {\n const { fetchDataFile, params, router, route } = this.props;\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n router.setRouteLeaveHook(route, this.routerWillLeave);\n fetchDataFile(directory, filename);\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.updated !== nextProps.updated) {\n const new_path = nextProps.datafile.path;\n const path = this.props.datafile.path;\n\n // redirect if the path is changed\n if (new_path !== path) {\n browserHistory.push(\n `${ADMIN_PREFIX}/datafiles/${nextProps.datafile.relative_path}`\n );\n }\n }\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n const { datafileChanged, fieldChanged } = this.props;\n if (datafileChanged || fieldChanged) {\n return getLeaveMessage();\n }\n };\n\n toggleView = () => {\n this.setState(state => {\n return { guiView: !state.guiView };\n });\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const {\n datafile,\n datafileChanged,\n fieldChanged,\n putDataFile,\n params,\n } = this.props;\n const { path, relative_path } = datafile;\n const data_dir = path.replace(relative_path, '');\n\n let name, data, mode;\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n if (datafileChanged || fieldChanged) {\n if (this.state.guiView) {\n const { filepath, extname } = this.refs.gui.refs;\n name = filepath.value + extname.value;\n data = null;\n mode = 'gui';\n } else {\n const { input } = this.refs.inputpath.refs;\n name = input.value || input.props.defaultValue;\n data = this.refs.editor.getValue();\n mode = 'editor';\n }\n\n const data_path = directory\n ? data_dir + `${directory}/` + name\n : data_dir + name;\n\n const new_path = data_path !== path ? data_path : '';\n putDataFile(directory, filename, data, new_path, mode);\n }\n };\n\n handleClickDelete(path) {\n const { deleteDataFile, params } = this.props;\n const confirm = window.confirm(getDeleteMessage(path));\n\n if (confirm) {\n const directory = params.splat[0];\n const filename = getFilenameFromPath(path);\n deleteDataFile(directory, filename);\n const dir = directory ? `/${directory}` : '';\n browserHistory.push(`${ADMIN_PREFIX}/datafiles${dir}`);\n }\n }\n\n renderAside() {\n const { datafile, datafileChanged, fieldChanged, updated } = this.props;\n const { path } = datafile;\n const filename = getFilenameFromPath(path);\n const ext = getExtensionFromPath(path);\n const guiSupport = /ya?ml|json/i.test(ext);\n\n return (\n <div className=\"content-side\">\n <Button\n onClick={this.handleClickSave}\n type=\"save\"\n active={datafileChanged || fieldChanged}\n triggered={updated}\n block\n />\n {guiSupport && (\n <Button\n onClick={this.toggleView}\n type=\"view-toggle\"\n triggered={this.state.guiView}\n active\n block\n />\n )}\n <Splitter />\n <Button\n onClick={() => this.handleClickDelete(filename)}\n type=\"delete\"\n active\n block\n />\n </div>\n );\n }\n\n renderContentBody(filename) {\n const { datafile, datafileChanged, onDataFileChanged } = this.props;\n const { raw_content, content, slug, ext } = datafile;\n const { guiView } = this.state;\n\n if (guiView && content) {\n return (\n <div className=\"content-body\">\n <DataGUI\n fields={content}\n slug={slug}\n ext={ext}\n onChange={onDataFileChanged}\n ref=\"gui\"\n />\n </div>\n );\n } else if (!guiView && raw_content) {\n return (\n <div className=\"content-body\">\n <InputPath\n onChange={onDataFileChanged}\n type=\"data files\"\n path={filename}\n ref=\"inputpath\"\n />\n <Editor\n editorChanged={datafileChanged}\n onEditorChange={onDataFileChanged}\n content={raw_content}\n type={ext}\n ref=\"editor\"\n />\n </div>\n );\n }\n }\n\n render() {\n const { datafile, isFetching, params, errors } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n if (_.isEmpty(datafile.content)) {\n return <h1>{getNotFoundMessage('content')}</h1>;\n }\n\n const directory = params.splat[0];\n const filename = getFilenameFromPath(datafile.path);\n\n const keyboardHandlers = {\n save: this.handleClickSave,\n };\n\n const document_title = getDocumentTitle('data files', directory, filename);\n\n return (\n <DocumentTitle title={document_title}>\n <HotKeys handlers={keyboardHandlers} className=\"single\">\n {errors.length > 0 && <Errors errors={errors} />}\n\n <div className=\"content-header\">\n <Breadcrumbs type=\"datafiles\" splat={directory} />\n </div>\n\n <div className=\"content-wrapper\">\n {this.renderContentBody(filename)}\n {this.renderAside()}\n </div>\n </HotKeys>\n </DocumentTitle>\n );\n }\n}\n\nDataFileEdit.propTypes = {\n fetchDataFile: PropTypes.func.isRequired,\n putDataFile: PropTypes.func.isRequired,\n deleteDataFile: PropTypes.func.isRequired,\n clearErrors: PropTypes.func.isRequired,\n datafile: PropTypes.object.isRequired,\n onDataFileChanged: PropTypes.func.isRequired,\n isFetching: PropTypes.bool.isRequired,\n updated: PropTypes.bool.isRequired,\n datafileChanged: PropTypes.bool.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n errors: PropTypes.array.isRequired,\n params: PropTypes.object.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n datafile: state.datafiles.currentFile,\n isFetching: state.datafiles.isFetching,\n updated: state.datafiles.updated,\n datafileChanged: state.datafiles.datafileChanged,\n fieldChanged: state.metadata.fieldChanged,\n errors: state.utils.errors,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchDataFile,\n putDataFile,\n deleteDataFile,\n onDataFileChanged,\n clearErrors,\n },\n dispatch\n );\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(DataFileEdit)\n);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { browserHistory, withRouter } from 'react-router';\nimport { HotKeys } from 'react-hotkeys';\nimport DocumentTitle from 'react-document-title';\nimport DataGUI from '../../components/DataGUI';\nimport Errors from '../../components/Errors';\nimport Editor from '../../components/Editor';\nimport Button from '../../components/Button';\nimport Breadcrumbs from '../../components/Breadcrumbs';\nimport InputPath from '../../components/form/InputPath';\nimport { clearErrors } from '../../ducks/utils';\nimport { putDataFile, onDataFileChanged } from '../../ducks/datafiles';\nimport { preventDefault, getDocumentTitle } from '../../utils/helpers';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getLeaveMessage } = translations;\n\nexport class DataFileNew extends Component {\n state = {\n guiView: false,\n };\n\n componentDidMount() {\n const { router, route } = this.props;\n router.setRouteLeaveHook(route, this.routerWillLeave);\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.updated !== nextProps.updated) {\n browserHistory.push(\n `${ADMIN_PREFIX}/datafiles/${nextProps.datafile.relative_path}`\n );\n }\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n if (!this.state.guiView && this.props.datafileChanged) {\n return getLeaveMessage();\n }\n };\n\n toggleView = () => {\n this.setState(state => {\n return { guiView: !state.guiView };\n });\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const { datafileChanged, fieldChanged, putDataFile, params } = this.props;\n let filename;\n\n if (datafileChanged || fieldChanged) {\n if (this.state.guiView) {\n const { filepath, extname } = this.refs.gui.refs;\n filename = filepath.value + extname.value;\n putDataFile(params.splat, filename, null, null, 'gui');\n } else {\n filename = this.refs.inputpath.refs.input.value;\n putDataFile(params.splat, filename, this.refs.editor.getValue());\n }\n }\n };\n\n renderAside() {\n const { datafileChanged, fieldChanged, updated } = this.props;\n\n return (\n <div className=\"content-side\">\n <Button\n onClick={this.handleClickSave}\n type=\"create\"\n active={datafileChanged || fieldChanged}\n triggered={updated}\n block\n />\n <Button\n onClick={this.toggleView}\n type=\"view-toggle\"\n triggered={this.state.guiView}\n active\n block\n />\n </div>\n );\n }\n\n renderContentBody() {\n const { datafileChanged, onDataFileChanged } = this.props;\n\n if (this.state.guiView) {\n return (\n <div className=\"content-body\">\n <DataGUI onChange={onDataFileChanged} ref=\"gui\" />\n </div>\n );\n }\n\n return (\n <div className=\"content-body\">\n <InputPath\n onChange={onDataFileChanged}\n type=\"data files\"\n path=\"\"\n ref=\"inputpath\"\n />\n <Editor\n editorChanged={datafileChanged}\n onEditorChange={onDataFileChanged}\n content=\"\"\n ref=\"editor\"\n />\n </div>\n );\n }\n\n render() {\n const { errors, params } = this.props;\n\n const keyboardHandlers = {\n save: this.handleClickSave,\n };\n\n const title = getDocumentTitle('data files', params.splat, 'New data file');\n\n return (\n <DocumentTitle title={title}>\n <HotKeys handlers={keyboardHandlers}>\n {errors.length > 0 && <Errors errors={errors} />}\n\n <div className=\"content-header\">\n <Breadcrumbs type=\"datafiles\" splat={params.splat} />\n </div>\n\n <div className=\"content-wrapper\">\n {this.renderContentBody()}\n {this.renderAside()}\n </div>\n </HotKeys>\n </DocumentTitle>\n );\n }\n}\n\nDataFileNew.propTypes = {\n putDataFile: PropTypes.func.isRequired,\n datafile: PropTypes.object.isRequired,\n onDataFileChanged: PropTypes.func.isRequired,\n clearErrors: PropTypes.func.isRequired,\n errors: PropTypes.array.isRequired,\n updated: PropTypes.bool.isRequired,\n datafileChanged: PropTypes.bool.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n params: PropTypes.object.isRequired,\n fieldChanged: PropTypes.bool,\n};\n\nconst mapStateToProps = state => ({\n datafile: state.datafiles.currentFile,\n updated: state.datafiles.updated,\n datafileChanged: state.datafiles.datafileChanged,\n fieldChanged: state.metadata.fieldChanged,\n errors: state.utils.errors,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n putDataFile,\n onDataFileChanged,\n clearErrors,\n },\n dispatch\n );\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(DataFileNew)\n);\n","import { clearErrors, validationError, filterDeleted } from './utils';\nimport { PUT_DOCUMENT_SUCCESS, PUT_DOCUMENT_FAILURE } from './collections';\nimport { get, put, del } from '../utils/fetch';\nimport { validatePage } from '../utils/validation';\nimport {\n slugify,\n preparePayload,\n sanitizeFrontMatter,\n computeRelativePath,\n} from '../utils/helpers';\nimport { draftsAPIUrl, draftAPIUrl, documentAPIUrl } from '../constants/api';\n\n// Action Types\nexport const FETCH_DRAFTS_REQUEST = 'FETCH_DRAFTS_REQUEST';\nexport const FETCH_DRAFTS_SUCCESS = 'FETCH_DRAFTS_SUCCESS';\nexport const FETCH_DRAFTS_FAILURE = 'FETCH_DRAFTS_FAILURE';\nexport const FETCH_DRAFT_REQUEST = 'FETCH_DRAFT_REQUEST';\nexport const FETCH_DRAFT_SUCCESS = 'FETCH_DRAFT_SUCCESS';\nexport const FETCH_DRAFT_FAILURE = 'FETCH_DRAFT_FAILURE';\nexport const PUT_DRAFT_REQUEST = 'PUT_DRAFT_REQUEST';\nexport const PUT_DRAFT_SUCCESS = 'PUT_DRAFT_SUCCESS';\nexport const PUT_DRAFT_FAILURE = 'PUT_DRAFT_FAILURE';\nexport const DELETE_DRAFT_REQUEST = 'DELETE_DRAFT_REQUEST';\nexport const DELETE_DRAFT_SUCCESS = 'DELETE_DRAFT_SUCCESS';\nexport const DELETE_DRAFT_FAILURE = 'DELETE_DRAFT_FAILURE';\n\n// Actions\nexport const fetchDrafts = (directory = '') => dispatch => {\n dispatch({ type: FETCH_DRAFTS_REQUEST });\n return get(\n draftsAPIUrl(directory),\n { type: FETCH_DRAFTS_SUCCESS, name: 'drafts' },\n { type: FETCH_DRAFTS_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const fetchDraft = (directory, filename) => dispatch => {\n dispatch({ type: FETCH_DRAFT_REQUEST });\n return get(\n draftAPIUrl(directory, filename),\n { type: FETCH_DRAFT_SUCCESS, name: 'draft' },\n { type: FETCH_DRAFT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const createDraft = directory => (dispatch, getState) => {\n // get edited fields from metadata state\n const metadata = getState().metadata.metadata;\n let { path, raw_content, title } = metadata;\n // if `path` is a falsy value or if appending a slash to it equals to\n // `directory`, generate filename from `title`.\n if ((!path || `${path}/` === directory) && title) {\n path = `${slugify(title)}.md`;\n } else {\n const errors = validatePage(metadata);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n }\n // clear errors\n dispatch(clearErrors());\n\n const front_matter = sanitizeFrontMatter(metadata);\n\n // strip '_drafts/' from path when provided\n const filename = path.replace('_drafts/', '');\n\n // send the put request\n return put(\n draftAPIUrl(directory, filename),\n preparePayload({ front_matter, raw_content }),\n { type: PUT_DRAFT_SUCCESS, name: 'draft' },\n { type: PUT_DRAFT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const putDraft = (directory, filename) => (dispatch, getState) => {\n // get edited fields from metadata state\n const metadata = getState().metadata.metadata;\n let { path, raw_content, title } = metadata;\n // if `path` is a falsy value or if appending a slash to it equals to\n // `directory`, generate filename from `title`.\n if ((!path || `${path}/` === directory) && title) {\n path = `${slugify(title)}.md`;\n } else {\n const errors = validatePage(metadata);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n }\n // clear errors\n dispatch(clearErrors());\n\n const front_matter = sanitizeFrontMatter(metadata);\n const relative_path = directory\n ? `_drafts/${directory}/${path}`\n : `_drafts/${path}`;\n\n // send the put request\n return put(\n draftAPIUrl(directory, filename),\n preparePayload({ path: relative_path, front_matter, raw_content }),\n { type: PUT_DRAFT_SUCCESS, name: 'draft' },\n { type: PUT_DRAFT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const deleteDraft = (directory, filename) => dispatch => {\n const relative_path = computeRelativePath(directory, filename);\n return del(\n draftAPIUrl(directory, filename),\n { type: DELETE_DRAFT_SUCCESS, name: 'draft', id: relative_path },\n { type: DELETE_DRAFT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\nexport const publishDraft = (directory, filename) => (dispatch, getState) => {\n const metadata = getState().metadata.metadata;\n let { path, raw_content, title } = metadata;\n // if path is not given or equals to directory, generate filename from the title\n if (!path && title) {\n path = `${slugify(title)}.md`;\n } else {\n const errors = validatePage(metadata);\n if (errors.length) {\n return dispatch(validationError(errors));\n }\n }\n // clear errors\n dispatch(clearErrors());\n\n const front_matter = sanitizeFrontMatter(metadata);\n\n return put(\n documentAPIUrl('posts', directory, filename),\n preparePayload({ raw_content, front_matter }),\n { type: PUT_DOCUMENT_SUCCESS, name: 'doc' },\n { type: PUT_DOCUMENT_FAILURE, name: 'error' },\n dispatch\n );\n};\n\n// Reducer\nexport default function drafts(\n state = {\n drafts: [],\n draft: {},\n isFetching: false,\n updated: false,\n },\n action\n) {\n switch (action.type) {\n case FETCH_DRAFTS_REQUEST:\n case FETCH_DRAFT_REQUEST:\n return {\n ...state,\n isFetching: true,\n };\n case FETCH_DRAFTS_SUCCESS:\n return {\n ...state,\n drafts: action.drafts,\n isFetching: false,\n draft: {},\n };\n case FETCH_DRAFTS_FAILURE:\n return {\n ...state,\n isFetching: false,\n drafts: [],\n };\n case FETCH_DRAFT_SUCCESS:\n return {\n ...state,\n draft: action.draft,\n isFetching: false,\n };\n case FETCH_DRAFT_FAILURE:\n return {\n ...state,\n draft: {},\n isFetching: false,\n };\n case PUT_DRAFT_SUCCESS:\n return {\n ...state,\n draft: action.draft,\n updated: true,\n };\n case DELETE_DRAFT_SUCCESS:\n return {\n ...state,\n drafts: filterDeleted(state.drafts, action.id),\n };\n default:\n return {\n ...state,\n updated: false,\n };\n }\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport DocumentTitle from 'react-document-title';\nimport Explorer from '../../components/Explorer';\nimport { search, filterBySearchInput } from '../../ducks/utils';\nimport { fetchDrafts, deleteDraft } from '../../ducks/drafts';\nimport { getDocumentTitle } from '../../utils/helpers';\n\nexport class Drafts extends Component {\n componentDidMount() {\n const { fetchDrafts, params } = this.props;\n fetchDrafts(params.splat);\n }\n\n componentWillReceiveProps(nextProps) {\n const { fetchDrafts } = nextProps;\n if (this.props.params.splat !== nextProps.params.splat) {\n fetchDrafts(nextProps.params.splat);\n }\n }\n\n render() {\n const { isFetching, drafts, search, params, deleteDraft } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n const title = getDocumentTitle('drafts', params.splat);\n\n return (\n <DocumentTitle title={title}>\n <Explorer\n type=\"drafts\"\n items={drafts}\n params={params}\n newBtnLabel=\"New draft\"\n search={search}\n deleteItem={deleteDraft}\n />\n </DocumentTitle>\n );\n }\n}\n\nDrafts.propTypes = {\n drafts: PropTypes.array.isRequired,\n fetchDrafts: PropTypes.func.isRequired,\n deleteDraft: PropTypes.func.isRequired,\n isFetching: PropTypes.bool.isRequired,\n search: PropTypes.func.isRequired,\n params: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n drafts: filterBySearchInput(state.drafts.drafts, state.utils.input),\n isFetching: state.drafts.isFetching,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchDrafts,\n deleteDraft,\n search,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Drafts);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { browserHistory, withRouter } from 'react-router';\nimport { HotKeys } from 'react-hotkeys';\nimport _ from 'underscore';\nimport moment from 'moment';\nimport DocumentTitle from 'react-document-title';\nimport Button from '../../components/Button';\nimport Errors from '../../components/Errors';\nimport Splitter from '../../components/Splitter';\nimport Breadcrumbs from '../../components/Breadcrumbs';\nimport MarkdownPageBody from '../../components/MarkdownPageBody';\nimport {\n fetchDraft,\n deleteDraft,\n putDraft,\n publishDraft,\n} from '../../ducks/drafts';\nimport { updateTitle, updateBody, updatePath } from '../../ducks/metadata';\nimport { clearErrors } from '../../ducks/utils';\nimport { preventDefault, getDocumentTitle } from '../../utils/helpers';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst {\n getLeaveMessage,\n getDeleteMessage,\n getPublishDraftMessage,\n} = translations;\n\nexport class DraftEdit extends Component {\n componentDidMount() {\n const { fetchDraft, params, router, route } = this.props;\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n fetchDraft(directory, filename);\n\n router.setRouteLeaveHook(route, this.routerWillLeave);\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.updated !== nextProps.updated) {\n const new_path = nextProps.draft.path;\n const path = this.props.draft.path;\n // redirect if the path is changed\n if (new_path !== path) {\n browserHistory.push(\n `${ADMIN_PREFIX}/drafts/${nextProps.draft.relative_path}`\n );\n }\n }\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n if (this.props.fieldChanged) {\n return getLeaveMessage();\n }\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const { putDraft, fieldChanged, params } = this.props;\n if (fieldChanged) {\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n putDraft(directory, filename);\n }\n };\n\n handleClickPublish(path) {\n const { deleteDraft, publishDraft, params } = this.props;\n\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n const today = moment().format('YYYY-MM-DD');\n const datedfilename = `${today}-${filename}`;\n const postPath = directory\n ? `_posts/${directory}/${datedfilename}`\n : `_posts/${datedfilename}`;\n\n const confirm = window.confirm(getPublishDraftMessage(path, postPath));\n if (confirm) {\n const goTo = directory ? `/${directory}` : '';\n deleteDraft(directory, filename);\n publishDraft(directory, datedfilename);\n browserHistory.push(`${ADMIN_PREFIX}/drafts${goTo}`);\n }\n }\n\n handleClickDelete(name) {\n const { deleteDraft, params } = this.props;\n const confirm = window.confirm(getDeleteMessage(name));\n if (confirm) {\n const [directory, ...rest] = params.splat;\n const filename = rest.join('.');\n const goTo = directory ? `/${directory}` : '';\n deleteDraft(directory, filename);\n browserHistory.push(`${ADMIN_PREFIX}/drafts${goTo}`);\n }\n }\n\n render() {\n const {\n isFetching,\n draft,\n errors,\n updateTitle,\n updateBody,\n updatePath,\n updated,\n fieldChanged,\n params,\n } = this.props;\n\n if (isFetching) {\n return null;\n } else if (_.isEmpty(draft)) {\n return <h1>Could not find the draft.</h1>;\n }\n\n const keyboardHandlers = {\n save: this.handleClickSave,\n };\n\n const {\n name,\n path,\n raw_content,\n http_url,\n front_matter,\n front_matter_defaults,\n } = draft;\n const directory = params.splat[0];\n const title = front_matter && front_matter.title ? front_matter.title : '';\n const document_title = getDocumentTitle('drafts', directory, title || name);\n\n return (\n <DocumentTitle title={document_title}>\n <HotKeys handlers={keyboardHandlers} className=\"single\">\n {errors.length > 0 && <Errors errors={errors} />}\n <div className=\"content-header\">\n <Breadcrumbs type=\"drafts\" splat={directory} />\n </div>\n\n <div className=\"content-wrapper\">\n <MarkdownPageBody\n type=\"drafts\"\n path={name}\n title={title}\n body={raw_content}\n updatePath={updatePath}\n updateBody={updateBody}\n updateTitle={updateTitle}\n onSave={this.handleClickSave}\n metafields={{ title, raw_content, path: name, ...front_matter }}\n staticmetafields={front_matter_defaults}\n />\n <div className=\"content-side\">\n <Button\n onClick={this.handleClickSave}\n type=\"save\"\n active={fieldChanged}\n triggered={updated}\n block\n />\n <Button to={http_url} type=\"view\" active block />\n <Splitter />\n <Button\n onClick={() => this.handleClickPublish(path)}\n type=\"publish\"\n active\n block\n />\n <Button\n onClick={() => this.handleClickDelete(name)}\n type=\"delete\"\n active\n block\n />\n </div>\n </div>\n </HotKeys>\n </DocumentTitle>\n );\n }\n}\n\nDraftEdit.propTypes = {\n draft: PropTypes.object.isRequired,\n fetchDraft: PropTypes.func.isRequired,\n deleteDraft: PropTypes.func.isRequired,\n putDraft: PropTypes.func.isRequired,\n updateTitle: PropTypes.func.isRequired,\n updateBody: PropTypes.func.isRequired,\n updatePath: PropTypes.func.isRequired,\n clearErrors: PropTypes.func.isRequired,\n publishDraft: PropTypes.func.isRequired,\n isFetching: PropTypes.bool.isRequired,\n errors: PropTypes.array.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n updated: PropTypes.bool.isRequired,\n params: PropTypes.object.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n draft: state.drafts.draft,\n isFetching: state.drafts.isFetching,\n fieldChanged: state.metadata.fieldChanged,\n updated: state.drafts.updated,\n errors: state.utils.errors,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchDraft,\n deleteDraft,\n putDraft,\n publishDraft,\n updateTitle,\n updateBody,\n updatePath,\n clearErrors,\n },\n dispatch\n );\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(DraftEdit)\n);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { browserHistory, withRouter } from 'react-router';\nimport DocumentTitle from 'react-document-title';\nimport CreateMarkdownPage from '../../components/CreateMarkdownPage';\nimport { updateTitle, updateBody, updatePath } from '../../ducks/metadata';\nimport { createDraft } from '../../ducks/drafts';\nimport { clearErrors } from '../../ducks/utils';\nimport { preventDefault, getDocumentTitle } from '../../utils/helpers';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getLeaveMessage } = translations;\n\nexport class DraftNew extends Component {\n componentDidMount() {\n const { router, route } = this.props;\n router.setRouteLeaveHook(route, this.routerWillLeave);\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.updated !== nextProps.updated) {\n browserHistory.push(\n `${ADMIN_PREFIX}/drafts/${nextProps.draft.relative_path}`\n );\n }\n }\n\n componentWillUnmount() {\n const { clearErrors, errors } = this.props;\n errors.length && clearErrors();\n }\n\n routerWillLeave = nextLocation => {\n if (this.props.fieldChanged) {\n return getLeaveMessage();\n }\n };\n\n handleClickSave = e => {\n preventDefault(e);\n const { fieldChanged, createDraft, params } = this.props;\n fieldChanged && createDraft(params.splat);\n };\n\n render() {\n const {\n params,\n config,\n errors,\n updated,\n updateBody,\n updatePath,\n updateTitle,\n fieldChanged,\n } = this.props;\n\n const title = getDocumentTitle('drafts', params.splat, 'New draft');\n\n return (\n <DocumentTitle title={title}>\n <CreateMarkdownPage\n type=\"drafts\"\n params={params}\n config={config}\n errors={errors}\n updated={updated}\n updateBody={updateBody}\n updatePath={updatePath}\n updateTitle={updateTitle}\n fieldChanged={fieldChanged}\n onClickSave={this.handleClickSave}\n />\n </DocumentTitle>\n );\n }\n}\n\nDraftNew.propTypes = {\n createDraft: PropTypes.func.isRequired,\n updateTitle: PropTypes.func.isRequired,\n updateBody: PropTypes.func.isRequired,\n updatePath: PropTypes.func.isRequired,\n clearErrors: PropTypes.func.isRequired,\n errors: PropTypes.array.isRequired,\n fieldChanged: PropTypes.bool.isRequired,\n updated: PropTypes.bool.isRequired,\n router: PropTypes.object.isRequired,\n route: PropTypes.object.isRequired,\n params: PropTypes.object.isRequired,\n config: PropTypes.object.isRequired,\n draft: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n draft: state.drafts.draft,\n fieldChanged: state.metadata.fieldChanged,\n errors: state.utils.errors,\n updated: state.drafts.updated,\n config: state.config.config,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n updateTitle,\n updateBody,\n updatePath,\n createDraft,\n clearErrors,\n },\n dispatch\n );\n\nexport default withRouter(\n connect(mapStateToProps, mapDispatchToProps)(DraftNew)\n);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'underscore';\nimport ReactDropzone from 'react-dropzone';\nimport FilePreview from './FilePreview';\nimport Splitter from './Splitter';\nimport Icon from './Icon';\n\nexport class Dropzone extends Component {\n openDropzone() {\n this.refs.ReactDropzone.open();\n }\n\n render() {\n const { files, splat, onDrop, onClickDelete, onClickItem } = this.props;\n return (\n <ReactDropzone\n onDrop={onDrop}\n ref=\"ReactDropzone\"\n className=\"dropzone\"\n activeClassName=\"dropzone-active\"\n multiple\n disableClick\n >\n {files.length ? (\n <div className=\"preview-container\">\n {_.map(files, (file, i) => (\n <FilePreview\n key={i}\n onClick={onClickItem}\n onClickDelete={onClickDelete}\n splat={splat}\n file={file}\n />\n ))}\n <Splitter />\n <div className=\"preview-tip\">\n <div>Drag and drop file(s) here to upload</div>\n </div>\n </div>\n ) : (\n <div className=\"preview-info\">\n <Icon name=\"upload\" />\n <p>Drag and drop file(s) here to upload</p>\n </div>\n )}\n </ReactDropzone>\n );\n }\n}\n\nDropzone.propTypes = {\n files: PropTypes.array.isRequired,\n splat: PropTypes.string.isRequired,\n onDrop: PropTypes.func.isRequired,\n onClickDelete: PropTypes.func.isRequired,\n onClickItem: PropTypes.func,\n};\n\nexport default Dropzone;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport DocumentTitle from 'react-document-title';\nimport Dropzone from '../../components/Dropzone';\nimport Button from '../../components/Button';\nimport Icon from '../../components/Icon';\nimport Breadcrumbs from '../../components/Breadcrumbs';\nimport InputSearch from '../../components/form/InputSearch';\nimport { search } from '../../ducks/utils';\nimport {\n existingUploadedFilenames,\n getDocumentTitle,\n} from '../../utils/helpers';\nimport {\n fetchStaticFiles,\n uploadStaticFiles,\n deleteStaticFile,\n filterByFilename,\n} from '../../ducks/staticfiles';\nimport { ADMIN_PREFIX } from '../../constants';\n\nimport translations from '../../translations';\nconst { getOverrideMessage } = translations;\n\nexport class StaticFiles extends Component {\n componentDidMount() {\n const { fetchStaticFiles, params } = this.props;\n fetchStaticFiles(params.splat);\n }\n\n componentWillReceiveProps(nextProps) {\n const { fetchStaticFiles } = nextProps;\n if (this.props.params.splat !== nextProps.params.splat) {\n fetchStaticFiles(nextProps.params.splat);\n }\n }\n\n onDrop(uploadedFiles) {\n const { uploadStaticFiles, files, params } = this.props;\n const existingFiles = existingUploadedFilenames(uploadedFiles, files);\n if (existingFiles.length > 0) {\n const confirm = window.confirm(\n getOverrideMessage(existingFiles.join(', '))\n );\n if (!confirm) {\n return false;\n }\n }\n uploadStaticFiles(params.splat, uploadedFiles);\n }\n\n openDropzone = () => {\n this.refs.dropzone.openDropzone();\n };\n\n renderFilePreviewRow(static_files, key) {\n const { params, onClickStaticFile, deleteStaticFile } = this.props;\n return (\n <tr key={key}>\n <td>\n <Dropzone\n ref=\"dropzone\"\n splat={params.splat || ''}\n files={static_files}\n onClickItem={onClickStaticFile}\n onClickDelete={deleteStaticFile}\n onDrop={static_files => this.onDrop(static_files)}\n />\n </td>\n </tr>\n );\n }\n\n renderDirectoryRow(directory, index) {\n const { name, path } = directory;\n const to = `${ADMIN_PREFIX}/staticfiles/${path}`;\n return (\n <tr key={index}>\n <td className=\"row-title\">\n <strong>\n <Link to={to}>\n <Icon name=\"folder\" />\n {name}\n </Link>\n </strong>\n </td>\n </tr>\n );\n }\n\n renderRows() {\n const { files } = this.props;\n const dirs = files.filter(entity => entity.type === 'directory');\n const static_files = files.filter(entity => !entity.type);\n\n return dirs\n .map((entry, index) => this.renderDirectoryRow(entry, index))\n .concat(this.renderFilePreviewRow(static_files, dirs.length + 1));\n }\n\n renderTable() {\n return (\n <div className=\"content-table\">\n <table>\n <thead>\n <tr>\n <th>Directory Contents</th>\n </tr>\n </thead>\n <tbody>{this.renderRows()}</tbody>\n </table>\n </div>\n );\n }\n\n render() {\n const { isFetching, params, search } = this.props;\n\n if (isFetching) {\n return null;\n }\n\n const to = `${ADMIN_PREFIX}/staticfiles/index`;\n const title = getDocumentTitle('static files', params.splat);\n\n return (\n <DocumentTitle title={title}>\n <div>\n <div className=\"content-header\">\n <Breadcrumbs type=\"staticfiles\" splat={params.splat} />\n <div className=\"page-buttons multiple\">\n <Link className=\"btn btn-view\" to={to}>\n Index Listing\n </Link>\n <Button\n onClick={() => this.openDropzone()}\n type=\"upload\"\n active\n />\n </div>\n <div className=\"pull-right\">\n <InputSearch searchBy=\"filename\" search={search} />\n </div>\n </div>\n {this.renderTable()}\n </div>\n </DocumentTitle>\n );\n }\n}\n\nStaticFiles.propTypes = {\n files: PropTypes.array.isRequired,\n isFetching: PropTypes.bool.isRequired,\n fetchStaticFiles: PropTypes.func.isRequired,\n uploadStaticFiles: PropTypes.func.isRequired,\n deleteStaticFile: PropTypes.func.isRequired,\n onClickStaticFile: PropTypes.func,\n search: PropTypes.func.isRequired,\n params: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n files: filterByFilename(state.staticfiles.files, state.utils.input),\n isFetching: state.staticfiles.isFetching,\n});\n\nconst mapDispatchToProps = dispatch =>\n bindActionCreators(\n {\n fetchStaticFiles,\n uploadStaticFiles,\n deleteStaticFile,\n search,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(StaticFiles);\n","import React from 'react';\n\nconst NotFound = () => (\n <div className=\"notfound\">\n <img src={require('../../assets/images/logo-black-red.png')} alt=\"Jekyll Admin\" />\n <h1>Huh. It seems that page is Hyde-ing...</h1>\n <h2>The resource you requested was not found.</h2>\n </div>\n);\n\nexport default NotFound;\n","import React from 'react';\nimport { Route, IndexRoute } from 'react-router';\nimport { ADMIN_PREFIX } from './constants';\n\nimport App from './containers/App';\nimport Configuration from './containers/views/Configuration';\nimport Pages from './containers/views/Pages';\nimport PageEdit from './containers/views/PageEdit';\nimport PageNew from './containers/views/PageNew';\nimport Documents from './containers/views/Documents';\nimport DocumentEdit from './containers/views/DocumentEdit';\nimport DocumentNew from './containers/views/DocumentNew';\nimport DataFiles from './containers/views/DataFiles';\nimport DataFileEdit from './containers/views/DataFileEdit';\nimport DataFileNew from './containers/views/DataFileNew';\nimport Drafts from './containers/views/Drafts';\nimport DraftEdit from './containers/views/DraftEdit';\nimport DraftNew from './containers/views/DraftNew';\nimport StaticFiles from './containers/views/StaticFiles';\nimport StaticIndex from './containers/views/StaticIndex';\nimport NotFound from './containers/views/NotFound';\n\nexport default (\n <Route path={`${ADMIN_PREFIX}`} component={App}>\n <IndexRoute component={Pages} />\n <Route path=\"configuration\" component={Configuration} />\n <Route path=\"pages\">\n <IndexRoute component={Pages} />\n <Route path=\"(**/)new\" component={PageNew} />\n <Route path=\"(**/)*.*\" component={PageEdit} />\n <Route path=\"**\" component={Pages} />\n </Route>\n <Route path=\"collections\">\n <Route path=\":collection_name\">\n <IndexRoute component={Documents} />\n <Route path=\"(**/)new\" component={DocumentNew} />\n <Route path=\"(**/)*.*\" component={DocumentEdit} />\n <Route path=\"**\" component={Documents} />\n </Route>\n </Route>\n <Route path=\"drafts\">\n <IndexRoute component={Drafts} />\n <Route path=\"(**/)new\" component={DraftNew} />\n <Route path=\"(**/)*.*\" component={DraftEdit} />\n <Route path=\"**\" component={Drafts} />\n </Route>\n <Route path=\"datafiles\">\n <IndexRoute component={DataFiles} />\n <Route path=\"(**/)new\" component={DataFileNew} />\n <Route path=\"(**/)*.*\" component={DataFileEdit} />\n <Route path=\"**\" component={DataFiles} />\n </Route>\n <Route path=\"staticfiles\">\n <IndexRoute component={StaticFiles} />\n <Route path=\"index\" component={StaticIndex} />\n <Route path=\"**\" component={StaticFiles} />\n </Route>\n <Route path={`${ADMIN_PREFIX}/*`} component={NotFound} />\n </Route>\n);\n","import { combineReducers } from 'redux';\nimport { routerReducer } from 'react-router-redux';\n\nimport config from './config';\nimport pages from './pages';\nimport collections from './collections';\nimport metadata from './metadata';\nimport drafts from './drafts';\nimport datafiles from './datafiles';\nimport staticfiles from './staticfiles';\nimport utils from './utils';\nimport siteMeta from './siteMeta';\nimport notifications from './notifications';\n\nexport default combineReducers({\n routing: routerReducer,\n meta: siteMeta,\n config,\n pages,\n collections,\n metadata,\n drafts,\n datafiles,\n staticfiles,\n utils,\n notifications,\n});\n","import { createStore, compose, applyMiddleware } from 'redux';\nimport reduxImmutableStateInvariant from 'redux-immutable-state-invariant';\nimport thunk from 'redux-thunk';\nimport createLogger from 'redux-logger';\nimport rootReducer from './ducks';\n\nconst logger = createLogger();\n\nconst configureStoreProd = initialState => {\n const middlewares = [thunk];\n\n return createStore(\n rootReducer,\n initialState,\n compose(applyMiddleware(...middlewares))\n );\n};\n\nconst configureStoreDev = initialState => {\n const middlewares = [reduxImmutableStateInvariant(), thunk, logger];\n\n const composeEnhancers =\n window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\n const store = createStore(\n rootReducer,\n initialState,\n composeEnhancers(applyMiddleware(...middlewares))\n );\n\n if (module.hot) {\n module.hot.accept('./ducks', () => {\n const nextReducer = require('./ducks').default;\n store.replaceReducer(nextReducer);\n });\n }\n\n return store;\n};\n\nconst configureStore =\n process.env.NODE_ENV === 'production'\n ? configureStoreProd\n : configureStoreDev;\n\nexport default configureStore;\n","/* eslint-disable import/default */\nimport React from 'react';\nimport { syncHistoryWithStore } from 'react-router-redux';\nimport { render } from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { Router, browserHistory, Redirect } from 'react-router';\nimport routes from './routes';\nimport configureStore from './store';\nimport { ADMIN_PREFIX } from './constants';\nimport './styles/main.scss';\n\nconst store = configureStore();\nconst history = syncHistoryWithStore(browserHistory, store);\n\nrender(\n <Provider store={store}>\n <Router history={history} routes={routes}>\n <Redirect from={`${ADMIN_PREFIX}/`} to={`${ADMIN_PREFIX}/pages/`} />\n </Router>\n </Provider>,\n document.getElementById('root')\n);\n"],"sourceRoot":""}
|