├── .babelrc ├── .codeclimate.yml ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .npmignore ├── .travis.yml ├── CONTRIBUTING.md ├── HISTORY.md ├── LICENSE ├── README.md ├── admin ├── client │ ├── App │ │ ├── App.js │ │ ├── components │ │ │ ├── Footer │ │ │ │ ├── index.js │ │ │ │ └── test │ │ │ │ │ └── component.test.js │ │ │ └── Navigation │ │ │ │ ├── Mobile │ │ │ │ ├── ListItem.js │ │ │ │ ├── SectionItem.js │ │ │ │ ├── index.js │ │ │ │ └── test │ │ │ │ │ ├── ListItem.test.js │ │ │ │ │ └── SectionItem.test.js │ │ │ │ ├── Primary │ │ │ │ ├── NavItem.js │ │ │ │ ├── index.js │ │ │ │ └── test │ │ │ │ │ ├── NavItem.test.js │ │ │ │ │ └── PrimaryNavigation.test.js │ │ │ │ └── Secondary │ │ │ │ ├── NavItem.js │ │ │ │ ├── index.js │ │ │ │ └── test │ │ │ │ └── NavItem.test.js │ │ ├── elemental │ │ │ ├── Alert │ │ │ │ ├── colors.js │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── BlankState │ │ │ │ └── index.js │ │ │ ├── Button │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── Center │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── Chip │ │ │ │ ├── colors.js │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── Container │ │ │ │ ├── index.js │ │ │ │ ├── sizes.js │ │ │ │ └── styles.js │ │ │ ├── DropdownButton │ │ │ │ └── index.js │ │ │ ├── Form │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── FormField │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── FormInput │ │ │ │ ├── index.js │ │ │ │ ├── noedit.js │ │ │ │ └── styles.js │ │ │ ├── FormLabel │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── FormNote │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── FormSelect │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── Glyph │ │ │ │ ├── colors.js │ │ │ │ ├── index.js │ │ │ │ ├── octicons.js │ │ │ │ ├── sizes.js │ │ │ │ └── styles.js │ │ │ ├── GlyphButton │ │ │ │ └── index.js │ │ │ ├── GlyphField │ │ │ │ └── index.js │ │ │ ├── Grid │ │ │ │ └── index.js │ │ │ ├── GridCol │ │ │ │ └── index.js │ │ │ ├── GridRow │ │ │ │ └── index.js │ │ │ ├── InlineGroup │ │ │ │ └── index.js │ │ │ ├── InlineGroupSection │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── LabelledControl │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── LoadingButton │ │ │ │ └── index.js │ │ │ ├── Modal │ │ │ │ ├── body.js │ │ │ │ ├── dialog.js │ │ │ │ ├── footer.js │ │ │ │ ├── header.js │ │ │ │ └── index.js │ │ │ ├── Pagination │ │ │ │ ├── index.js │ │ │ │ └── page.js │ │ │ ├── PassContext │ │ │ │ └── index.js │ │ │ ├── Portal │ │ │ │ └── index.js │ │ │ ├── ResponsiveText │ │ │ │ └── index.js │ │ │ ├── ScreenReaderOnly │ │ │ │ └── index.js │ │ │ ├── ScrollLock │ │ │ │ └── index.js │ │ │ ├── SegmentedControl │ │ │ │ ├── colors.js │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ │ ├── Spinner │ │ │ │ ├── colors.js │ │ │ │ ├── index.js │ │ │ │ ├── sizes.js │ │ │ │ └── styles.js │ │ │ └── index.js │ │ ├── index.js │ │ ├── parsers │ │ │ ├── filters.js │ │ │ ├── index.js │ │ │ └── tests │ │ │ │ └── index.test.js │ │ ├── sagas │ │ │ ├── index.js │ │ │ ├── queryParamsSagas.js │ │ │ └── test │ │ │ │ ├── index.test.js │ │ │ │ └── queryParamsSagas.test.js │ │ ├── screens │ │ │ ├── Home │ │ │ │ ├── actions.js │ │ │ │ ├── components │ │ │ │ │ ├── ListTile.js │ │ │ │ │ ├── Lists.js │ │ │ │ │ ├── Section.js │ │ │ │ │ └── test │ │ │ │ │ │ ├── ListTile.test.js │ │ │ │ │ │ ├── Lists.test.js │ │ │ │ │ │ └── Section.test.js │ │ │ │ ├── constants.js │ │ │ │ ├── index.js │ │ │ │ ├── reducer.js │ │ │ │ ├── test │ │ │ │ │ ├── Home.test.js │ │ │ │ │ ├── actions.test.js │ │ │ │ │ └── reducer.test.js │ │ │ │ └── utils │ │ │ │ │ ├── getRelatedIconClass.js │ │ │ │ │ └── test │ │ │ │ │ └── getRelatedIconClass.test.js │ │ │ ├── Item │ │ │ │ ├── actions.js │ │ │ │ ├── components │ │ │ │ │ ├── AltText.js │ │ │ │ │ ├── Drilldown.js │ │ │ │ │ ├── DrilldownItem.js │ │ │ │ │ ├── EditForm.js │ │ │ │ │ ├── EditFormHeader.js │ │ │ │ │ ├── EditFormHeaderSearch.js │ │ │ │ │ ├── FooterBar.js │ │ │ │ │ ├── FormHeading.js │ │ │ │ │ ├── RelatedItemsList │ │ │ │ │ │ ├── RelatedItemsList.js │ │ │ │ │ │ ├── RelatedItemsListDragDrop.js │ │ │ │ │ │ └── RelatedItemsListRow.js │ │ │ │ │ ├── Toolbar │ │ │ │ │ │ ├── ToolbarSection.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── test │ │ │ │ │ │ │ ├── Toolbar.test.js │ │ │ │ │ │ │ └── ToolbarSection.test.js │ │ │ │ │ └── test │ │ │ │ │ │ ├── AltText.test.js │ │ │ │ │ │ ├── EditFormHeader.test.js │ │ │ │ │ │ └── FormHeading.test.js │ │ │ │ ├── constants.js │ │ │ │ ├── index.js │ │ │ │ ├── reducer.js │ │ │ │ └── test │ │ │ │ │ ├── actions.test.js │ │ │ │ │ └── reducer.test.js │ │ │ └── List │ │ │ │ ├── actions │ │ │ │ ├── active.js │ │ │ │ ├── dragdrop.js │ │ │ │ ├── index.js │ │ │ │ ├── items.js │ │ │ │ └── test │ │ │ │ │ ├── actions.test.js │ │ │ │ │ ├── active.test.js │ │ │ │ │ ├── dragdrop.test.js │ │ │ │ │ └── items.test.js │ │ │ │ ├── components │ │ │ │ ├── Filtering │ │ │ │ │ ├── Filter.js │ │ │ │ │ ├── ListFilters.js │ │ │ │ │ ├── ListFiltersAdd.js │ │ │ │ │ ├── ListFiltersAddForm.js │ │ │ │ │ └── getFilterLabel.js │ │ │ │ ├── ItemsTable │ │ │ │ │ ├── ItemsTable.js │ │ │ │ │ ├── ItemsTableDragDrop.js │ │ │ │ │ ├── ItemsTableDragDropZone.js │ │ │ │ │ ├── ItemsTableDragDropZoneTarget.js │ │ │ │ │ └── ItemsTableRow.js │ │ │ │ ├── ListColumnsForm.js │ │ │ │ ├── ListControl.js │ │ │ │ ├── ListDownloadForm.js │ │ │ │ ├── ListHeaderButton.js │ │ │ │ ├── ListHeaderSearch.js │ │ │ │ ├── ListHeaderTitle.js │ │ │ │ ├── ListHeaderToolbar.js │ │ │ │ ├── ListManagement.js │ │ │ │ ├── ListSort.js │ │ │ │ └── UpdateForm.js │ │ │ │ ├── constants.js │ │ │ │ ├── index.js │ │ │ │ └── reducers │ │ │ │ ├── active.js │ │ │ │ ├── main.js │ │ │ │ └── test │ │ │ │ └── active.test.js │ │ ├── shared │ │ │ ├── AlertMessages.js │ │ │ ├── ConfirmationDialog.js │ │ │ ├── CreateForm.js │ │ │ ├── FlashMessage.js │ │ │ ├── FlashMessages.js │ │ │ ├── InvalidFieldType.js │ │ │ ├── Kbd.js │ │ │ ├── Popout │ │ │ │ ├── PopoutBody.js │ │ │ │ ├── PopoutFooter.js │ │ │ │ ├── PopoutHeader.js │ │ │ │ ├── PopoutList.js │ │ │ │ ├── PopoutListHeading.js │ │ │ │ ├── PopoutListItem.js │ │ │ │ ├── PopoutPane.js │ │ │ │ ├── index.js │ │ │ │ └── test │ │ │ │ │ ├── Popout.test.js │ │ │ │ │ ├── PopoutBody.test.js │ │ │ │ │ ├── PopoutFooter.test.js │ │ │ │ │ ├── PopoutHeader.test.js │ │ │ │ │ ├── PopoutList.test.js │ │ │ │ │ ├── PopoutListHeading.test.js │ │ │ │ │ ├── PopoutListItem.test.js │ │ │ │ │ └── PopoutPane.test.js │ │ │ ├── Portal.js │ │ │ └── test │ │ │ │ ├── AlertMessages.test.js │ │ │ │ ├── ConfirmationDialog.test.js │ │ │ │ ├── CreateForm.test.js │ │ │ │ ├── FlashMessage.test.js │ │ │ │ ├── FlashMessages.test.js │ │ │ │ ├── InvalidFieldType.test.js │ │ │ │ └── Portal.test.js │ │ ├── store.js │ │ └── test │ │ │ └── App.test.js │ ├── README.md │ ├── Signin │ │ ├── Signin.js │ │ ├── components │ │ │ ├── Alert.js │ │ │ ├── Brand.js │ │ │ ├── LoginForm.js │ │ │ ├── UserInfo.js │ │ │ └── test │ │ │ │ ├── Alert.test.js │ │ │ │ ├── Brand.test.js │ │ │ │ ├── LoginForm.test.js │ │ │ │ └── UserInfo.test.js │ │ ├── index.js │ │ └── test │ │ │ └── Signin.test.js │ ├── constants.js │ ├── packages.js │ ├── theme.js │ └── utils │ │ ├── List.js │ │ ├── cloudinaryResize.js │ │ ├── color.js │ │ ├── concatClassnames.js │ │ ├── css.js │ │ ├── lists.js │ │ ├── queryParams.js │ │ ├── string.js │ │ └── test │ │ └── queryParams.test.js ├── public │ ├── fonts │ │ └── octicons │ │ │ ├── octicons.eot │ │ │ ├── octicons.svg │ │ │ ├── octicons.ttf │ │ │ └── octicons.woff │ ├── images │ │ ├── datepicker-next.svg │ │ ├── datepicker-prev.svg │ │ ├── datepicker-select-handler.svg │ │ ├── icons │ │ │ ├── 16 │ │ │ │ ├── alert.png │ │ │ │ ├── checkbox-checked.png │ │ │ │ ├── checkbox-unchecked.png │ │ │ │ ├── cross.png │ │ │ │ ├── edit-bold.png │ │ │ │ ├── edit-code.png │ │ │ │ ├── edit-image.png │ │ │ │ ├── edit-indent.png │ │ │ │ ├── edit-italic.png │ │ │ │ ├── edit-link.png │ │ │ │ ├── edit-list-order.png │ │ │ │ ├── edit-list.png │ │ │ │ ├── edit-outdent.png │ │ │ │ ├── edit-size.png │ │ │ │ ├── exclamation.png │ │ │ │ ├── field-boolean.png │ │ │ │ ├── field-code.png │ │ │ │ ├── field-colour.png │ │ │ │ ├── field-date.png │ │ │ │ ├── field-dateTime.png │ │ │ │ ├── field-email.png │ │ │ │ ├── field-facebook.png │ │ │ │ ├── field-file.png │ │ │ │ ├── field-geoArea.png │ │ │ │ ├── field-html.png │ │ │ │ ├── field-image.png │ │ │ │ ├── field-key.png │ │ │ │ ├── field-location.png │ │ │ │ ├── field-minutes.png │ │ │ │ ├── field-money.png │ │ │ │ ├── field-mp3.png │ │ │ │ ├── field-name.png │ │ │ │ ├── field-number.png │ │ │ │ ├── field-numericSelect.png │ │ │ │ ├── field-password.png │ │ │ │ ├── field-phone.png │ │ │ │ ├── field-select.png │ │ │ │ ├── field-sort.png │ │ │ │ ├── field-text.png │ │ │ │ ├── field-textarea.png │ │ │ │ ├── field-textile.png │ │ │ │ ├── field-url.png │ │ │ │ └── tick-circle.png │ │ │ └── 32 │ │ │ │ ├── _blank.png │ │ │ │ ├── _page.png │ │ │ │ ├── aac.png │ │ │ │ ├── ai.png │ │ │ │ ├── aiff.png │ │ │ │ ├── avi.png │ │ │ │ ├── bmp.png │ │ │ │ ├── c.png │ │ │ │ ├── cpp.png │ │ │ │ ├── css.png │ │ │ │ ├── dat.png │ │ │ │ ├── dmg.png │ │ │ │ ├── doc.png │ │ │ │ ├── dotx.png │ │ │ │ ├── dwg.png │ │ │ │ ├── dxf.png │ │ │ │ ├── eps.png │ │ │ │ ├── exe.png │ │ │ │ ├── flv.png │ │ │ │ ├── gif.png │ │ │ │ ├── h.png │ │ │ │ ├── hpp.png │ │ │ │ ├── html.png │ │ │ │ ├── ics.png │ │ │ │ ├── iso.png │ │ │ │ ├── java.png │ │ │ │ ├── jpg.png │ │ │ │ ├── js.png │ │ │ │ ├── key.png │ │ │ │ ├── less.png │ │ │ │ ├── mid.png │ │ │ │ ├── mp3.png │ │ │ │ ├── mp4.png │ │ │ │ ├── mpg.png │ │ │ │ ├── odf.png │ │ │ │ ├── ods.png │ │ │ │ ├── odt.png │ │ │ │ ├── otp.png │ │ │ │ ├── ots.png │ │ │ │ ├── ott.png │ │ │ │ ├── pdf.png │ │ │ │ ├── php.png │ │ │ │ ├── png.png │ │ │ │ ├── ppt.png │ │ │ │ ├── psd.png │ │ │ │ ├── py.png │ │ │ │ ├── qt.png │ │ │ │ ├── rar.png │ │ │ │ ├── rb.png │ │ │ │ ├── rtf.png │ │ │ │ ├── sass.png │ │ │ │ ├── scss.png │ │ │ │ ├── sql.png │ │ │ │ ├── tga.png │ │ │ │ ├── tgz.png │ │ │ │ ├── tiff.png │ │ │ │ ├── txt.png │ │ │ │ ├── wav.png │ │ │ │ ├── xls.png │ │ │ │ ├── xlsx.png │ │ │ │ ├── xml.png │ │ │ │ ├── yml.png │ │ │ │ └── zip.png │ │ └── logo.png │ ├── js │ │ ├── content │ │ │ └── editor.js │ │ ├── lib │ │ │ ├── cloudinary │ │ │ │ └── jquery.cloudinary.js │ │ │ ├── codemirror │ │ │ │ ├── codemirror-compressed.js │ │ │ │ └── codemirror.css │ │ │ ├── jquery │ │ │ │ ├── jquery-1.10.2.js │ │ │ │ ├── jquery-1.10.2.min.js │ │ │ │ └── jquery-1.10.2.min.map │ │ │ └── jqueryfileupload │ │ │ │ ├── app.js │ │ │ │ ├── cors │ │ │ │ ├── jquery.postmessage-transport.js │ │ │ │ └── jquery.xdr-transport.js │ │ │ │ ├── jquery.fileupload-angular.js │ │ │ │ ├── jquery.fileupload-audio.js │ │ │ │ ├── jquery.fileupload-image.js │ │ │ │ ├── jquery.fileupload-jquery-ui.js │ │ │ │ ├── jquery.fileupload-process.js │ │ │ │ ├── jquery.fileupload-ui.js │ │ │ │ ├── jquery.fileupload-validate.js │ │ │ │ ├── jquery.fileupload-video.js │ │ │ │ ├── jquery.fileupload.js │ │ │ │ ├── jquery.iframe-transport.js │ │ │ │ ├── main.js │ │ │ │ └── vendor │ │ │ │ └── jquery.ui.widget.js │ │ └── packages.js │ └── styles │ │ ├── auth.less │ │ ├── content │ │ ├── editor.less │ │ └── editor.min.css │ │ ├── error.css │ │ ├── keystone.less │ │ ├── keystone │ │ ├── animation.less │ │ ├── base.less │ │ ├── dashboard.less │ │ ├── field-localfile.less │ │ ├── field-types.less │ │ ├── forms.less │ │ ├── item.less │ │ ├── list-controls.less │ │ ├── list-dropzone.less │ │ ├── list-sort.less │ │ ├── list.less │ │ ├── navigation.less │ │ ├── popout.less │ │ ├── tables.less │ │ ├── toolbar.less │ │ ├── utils.less │ │ └── wysiwyg.less │ │ ├── react │ │ └── react.less │ │ └── variables.less └── server │ ├── api │ ├── Readme.md │ ├── cloudinary.js │ ├── counts.js │ ├── download.js │ ├── item │ │ ├── get.js │ │ ├── sortOrder.js │ │ └── update.js │ ├── list │ │ ├── create.js │ │ ├── delete.js │ │ ├── download.js │ │ ├── get.js │ │ └── update.js │ ├── s3.js │ └── session │ │ ├── get.js │ │ ├── signin.js │ │ └── signout.js │ ├── app │ ├── createDynamicRouter.js │ ├── createHealthchecksHandler.js │ └── createStaticRouter.js │ ├── index.js │ ├── middleware │ ├── apiError.js │ ├── browserify.js │ ├── initList.js │ └── logError.js │ ├── routes │ ├── index.js │ ├── signin.js │ └── signout.js │ └── templates │ ├── index.html │ └── signin.html ├── build.js ├── docs ├── Getting Started │ ├── Setting-Up │ │ ├── part-1.md │ │ ├── part-2.md │ │ ├── part-3.md │ │ └── part-4.md │ ├── index.md │ └── yo-generator.md ├── api │ ├── Field │ │ ├── Underscore-Methods.md │ │ ├── index.md │ │ └── options.md │ ├── List │ │ ├── add.md │ │ ├── index.md │ │ ├── model.md │ │ ├── options.md │ │ ├── register.md │ │ ├── schema.md │ │ └── update-item.md │ ├── Methods │ │ ├── closeDatabaseConnection.md │ │ ├── create-items.md │ │ ├── create-router.md │ │ ├── get.md │ │ ├── import.md │ │ ├── importer.md │ │ ├── index.md │ │ ├── init.md │ │ ├── list.md │ │ ├── middleware.md │ │ ├── openDatabaseConnection.md │ │ ├── paginate.md │ │ ├── pre.md │ │ ├── set.md │ │ ├── start.md │ │ └── update-handler.md │ ├── View │ │ ├── index.md │ │ ├── on.md │ │ ├── query.md │ │ └── render.md │ └── index.md ├── documentation │ ├── Configuration │ │ ├── AdminUI-Options.md │ │ ├── Database-Options.md │ │ ├── Project-Options.md │ │ ├── Server-Options.md │ │ └── index.md │ ├── Database │ │ ├── application-updates.md │ │ ├── index.md │ │ └── relationships.md │ └── index.md └── guides │ ├── API-File-Image-Uploads.md │ ├── assets │ ├── mailgun-dashboard.png │ └── mailgun-go-to-auth-rep.png │ ├── how-to-create-a-blog-with-keystone.md │ ├── how-to-send-emails.md │ ├── index.md │ └── v0.3-to-v4.0-Upgrade-Guide.md ├── fields ├── README.md ├── components │ ├── Checkbox.js │ ├── CollapsedFieldLabel.js │ ├── DateInput.js │ ├── FileChangeMessage.js │ ├── HiddenFileInput.js │ ├── ImageThumbnail.js │ ├── ItemsTableCell.js │ ├── ItemsTableValue.js │ ├── NestedFormField.js │ ├── columns │ │ ├── ArrayColumn.js │ │ ├── CloudinaryImageSummary.js │ │ ├── IdColumn.js │ │ └── InvalidColumn.js │ └── test │ │ ├── ItemTableCell.test.js │ │ └── ItemTableValue.test.js ├── explorer │ ├── components │ │ ├── Col.js │ │ ├── FieldSpec.js │ │ ├── FieldType.js │ │ └── Row.js │ ├── index.css │ ├── index.html │ ├── index.js │ └── server.js ├── mixins │ └── ArrayField.js ├── types │ ├── Field.js │ ├── Type.js │ ├── azurefile │ │ ├── AzureFileColumn.js │ │ ├── AzureFileField.js │ │ ├── AzureFileFilter.js │ │ ├── AzureFileType.js │ │ └── Readme.md │ ├── boolean │ │ ├── BooleanColumn.js │ │ ├── BooleanField.js │ │ ├── BooleanFilter.js │ │ ├── BooleanType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── cloudinaryimage │ │ ├── CloudinaryImageColumn.js │ │ ├── CloudinaryImageField.js │ │ ├── CloudinaryImageFilter.js │ │ ├── CloudinaryImageType.js │ │ ├── Readme.md │ │ └── test │ │ │ └── explorer.js │ ├── cloudinaryimages │ │ ├── CloudinaryImagesColumn.js │ │ ├── CloudinaryImagesField.js │ │ ├── CloudinaryImagesFilter.js │ │ ├── CloudinaryImagesThumbnail.js │ │ ├── CloudinaryImagesType.js │ │ ├── Readme.md │ │ └── test │ │ │ └── explorer.js │ ├── code │ │ ├── CodeColumn.js │ │ ├── CodeField.js │ │ ├── CodeFilter.js │ │ ├── CodeType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ └── type.js │ ├── color │ │ ├── ColorColumn.js │ │ ├── ColorField.js │ │ ├── ColorFilter.js │ │ ├── ColorType.js │ │ ├── Readme.md │ │ ├── colored-swatch.js │ │ ├── test │ │ │ ├── explorer.js │ │ │ └── type.js │ │ └── transparent-swatch.js │ ├── date │ │ ├── DateColumn.js │ │ ├── DateField.js │ │ ├── DateFilter.js │ │ ├── DateType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── datearray │ │ ├── DateArrayColumn.js │ │ ├── DateArrayField.js │ │ ├── DateArrayFilter.js │ │ ├── DateArrayType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ └── type.js │ ├── datetime │ │ ├── DatetimeColumn.js │ │ ├── DatetimeField.js │ │ ├── DatetimeFilter.js │ │ ├── DatetimeType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ └── type.js │ ├── email │ │ ├── EmailColumn.js │ │ ├── EmailField.js │ │ ├── EmailFilter.js │ │ ├── EmailType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ └── type.js │ ├── embedly │ │ ├── EmbedlyColumn.js │ │ ├── EmbedlyField.js │ │ ├── EmbedlyFilter.js │ │ ├── EmbedlyType.js │ │ └── Readme.md │ ├── file │ │ ├── FileColumn.js │ │ ├── FileField.js │ │ ├── FileFilter.js │ │ ├── FileType.js │ │ └── Readme.md │ ├── geopoint │ │ ├── GeoPointColumn.js │ │ ├── GeoPointField.js │ │ ├── GeoPointFilter.js │ │ ├── GeoPointType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── html │ │ ├── HtmlColumn.js │ │ ├── HtmlField.js │ │ ├── HtmlFilter.js │ │ ├── HtmlType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ └── type.js │ ├── key │ │ ├── KeyColumn.js │ │ ├── KeyField.js │ │ ├── KeyFilter.js │ │ ├── KeyType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ └── type.js │ ├── localfile │ │ ├── LocalFileColumn.js │ │ ├── LocalFileField.js │ │ ├── LocalFileFilter.js │ │ ├── LocalFileType.js │ │ └── Readme.md │ ├── localfiles │ │ ├── LocalFilesColumn.js │ │ ├── LocalFilesField.js │ │ ├── LocalFilesFilter.js │ │ ├── LocalFilesType.js │ │ └── readme.md │ ├── location │ │ ├── LocationColumn.js │ │ ├── LocationField.js │ │ ├── LocationFilter.js │ │ ├── LocationType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── markdown │ │ ├── MarkdownColumn.js │ │ ├── MarkdownField.js │ │ ├── MarkdownFilter.js │ │ ├── MarkdownType.js │ │ ├── Readme.md │ │ ├── less │ │ │ └── bootstrap-markdown.less │ │ ├── lib │ │ │ └── bootstrap-markdown.js │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── money │ │ ├── MoneyColumn.js │ │ ├── MoneyField.js │ │ ├── MoneyFilter.js │ │ ├── MoneyType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ └── type.js │ ├── name │ │ ├── NameColumn.js │ │ ├── NameField.js │ │ ├── NameFilter.js │ │ ├── NameType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── number │ │ ├── NumberColumn.js │ │ ├── NumberField.js │ │ ├── NumberFilter.js │ │ ├── NumberType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── numberarray │ │ ├── NumberArrayColumn.js │ │ ├── NumberArrayField.js │ │ ├── NumberArrayFilter.js │ │ ├── NumberArrayType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── password │ │ ├── PasswordColumn.js │ │ ├── PasswordField.js │ │ ├── PasswordFilter.js │ │ ├── PasswordType.js │ │ ├── Readme.md │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── relationship │ │ ├── Readme.md │ │ ├── RelationshipColumn.js │ │ ├── RelationshipField.js │ │ ├── RelationshipFilter.js │ │ ├── RelationshipType.js │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── s3file │ │ ├── Readme.md │ │ ├── S3FileColumn.js │ │ ├── S3FileField.js │ │ ├── S3FileFilter.js │ │ └── S3FileType.js │ ├── select │ │ ├── Readme.md │ │ ├── SelectColumn.js │ │ ├── SelectField.js │ │ ├── SelectFilter.js │ │ ├── SelectType.js │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── text │ │ ├── Readme.md │ │ ├── TextColumn.js │ │ ├── TextField.js │ │ ├── TextFilter.js │ │ ├── TextType.js │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ ├── textarea │ │ ├── Readme.md │ │ ├── TextareaColumn.js │ │ ├── TextareaField.js │ │ ├── TextareaFilter.js │ │ ├── TextareaType.js │ │ └── test │ │ │ ├── explorer.js │ │ │ └── type.js │ ├── textarray │ │ ├── Readme.md │ │ ├── TextArrayColumn.js │ │ ├── TextArrayField.js │ │ ├── TextArrayFilter.js │ │ ├── TextArrayType.js │ │ └── test │ │ │ ├── explorer.js │ │ │ ├── filters.js │ │ │ └── type.js │ └── url │ │ ├── Readme.md │ │ ├── UrlColumn.js │ │ ├── UrlField.js │ │ ├── UrlFilter.js │ │ ├── UrlType.js │ │ └── test │ │ ├── explorer.js │ │ └── type.js └── utils │ ├── addPresenceToQuery.js │ ├── bindFunctions.js │ ├── definePrototypeGetters.js │ ├── evalDependsOn.js │ └── test │ └── utils.test.js ├── greenkeeper-prs ├── checkout.sh ├── filterbranches.js └── getbranches.sh ├── index.js ├── lib ├── content │ ├── index.js │ ├── page.js │ ├── type.js │ └── types │ │ ├── html.js │ │ ├── index.js │ │ └── text.js ├── core │ ├── closeDatabaseConnection.js │ ├── createItems.js │ ├── createKeystoneHash.js │ ├── createRouter.js │ ├── getOrphanedLists.js │ ├── importer.js │ ├── init.js │ ├── initDatabaseConfig.js │ ├── initExpressApp.js │ ├── initExpressSession.js │ ├── initNav.js │ ├── list.js │ ├── openDatabaseConnection.js │ ├── options.js │ ├── populateRelated.js │ ├── redirect.js │ ├── start.js │ └── wrapHTMLError.js ├── email.js ├── fieldTypes.js ├── list.js ├── list │ ├── add.js │ ├── addFiltersToQuery.js │ ├── addSearchToQuery.js │ ├── apiForGet.js │ ├── automap.js │ ├── buildSearchTextIndex.js │ ├── declaresTextIndex.js │ ├── ensureTextIndex.js │ ├── expandColumns.js │ ├── expandPaths.js │ ├── expandSort.js │ ├── field.js │ ├── getAdminURL.js │ ├── getCSVData.js │ ├── getData.js │ ├── getDocumentName.js │ ├── getOptions.js │ ├── getPages.js │ ├── getSearchFilters.js │ ├── getUniqueValue.js │ ├── isReserved.js │ ├── map.js │ ├── paginate.js │ ├── processFilters.js │ ├── register.js │ ├── relationship.js │ ├── selectColumns.js │ ├── set.js │ ├── underscoreMethod.js │ └── updateItem.js ├── middleware │ ├── api.js │ ├── cors.js │ └── language.js ├── path.js ├── safeRequire.js ├── schemaPlugins.js ├── schemaPlugins │ ├── autokey.js │ ├── history.js │ ├── methods │ │ ├── getRelated.js │ │ └── populateRelated.js │ ├── options │ │ └── transform.js │ ├── sortable.js │ └── track.js ├── security │ ├── csrf.js │ ├── escapeValueForExcel.js │ ├── frameGuard.js │ └── ipRangeRestrict.js ├── session.js ├── storage │ ├── README.md │ ├── adapters │ │ └── fs │ │ │ ├── README.md │ │ │ └── index.js │ └── index.js ├── updateHandler.js ├── updates.js ├── uploads.js └── view.js ├── netlify.toml ├── package-lock.json ├── package.json ├── server ├── bindBodyParser.js ├── bindErrorHandlers.js ├── bindIPRestrictions.js ├── bindLessMiddleware.js ├── bindRedirectsHandler.js ├── bindSassMiddleware.js ├── bindSessionMiddleware.js ├── bindStaticMiddleware.js ├── bindStylusMiddleware.js ├── createApp.js ├── initLetsEncrypt.js ├── initSslRedirect.js ├── initTrustProxy.js ├── initViewEngine.js ├── initViewLocals.js ├── startHTTPServer.js ├── startSecureServer.js └── startSocketServer.js ├── templates └── helpers │ └── emails │ ├── layouts │ ├── default.jade │ └── styles │ │ ├── default.jade │ │ └── ink.jade │ └── mixins │ └── button.jade ├── test ├── e2e │ ├── README.md │ ├── adminUI │ │ └── tests │ │ │ ├── group001Login │ │ │ ├── uiTestSigninView.js │ │ │ ├── uxTestSigninRedirect.js │ │ │ └── uxTestSigninView.js │ │ │ ├── group002App │ │ │ ├── uiTestAppView.js │ │ │ └── uxTestAppView.js │ │ │ ├── group003Home │ │ │ ├── uiTestHomeView.js │ │ │ └── uxTestHomeView.js │ │ │ ├── group004List │ │ │ ├── uiTestListView.js │ │ │ └── uxTestListView.js │ │ │ ├── group005Item │ │ │ ├── uiTestItemView.js │ │ │ └── uxTestItemView.js │ │ │ ├── group006Fields │ │ │ ├── commonFieldTestUtils.js │ │ │ ├── testBooleanField.js │ │ │ ├── testCloudinaryImageField.js │ │ │ ├── testCloudinaryImageMultipleField.js │ │ │ ├── testCodeField.js │ │ │ ├── testColorField.js │ │ │ ├── testDateArrayField.js │ │ │ ├── testDateField.js │ │ │ ├── testDatetimeField.js │ │ │ ├── testEmailField.js │ │ │ ├── testFileField.js │ │ │ ├── testGeoPointField.js │ │ │ ├── testHtmlField.js │ │ │ ├── testKeyField.js │ │ │ ├── testLocationField.js │ │ │ ├── testMarkdownField.js │ │ │ ├── testMoneyField.js │ │ │ ├── testNameField.js │ │ │ ├── testNumberArrayField.js │ │ │ ├── testNumberField.js │ │ │ ├── testPasswordField.js │ │ │ ├── testRelationshipField.js │ │ │ ├── testSelectField.js │ │ │ ├── testTextArrayField.js │ │ │ ├── testTextField.js │ │ │ ├── testTextareaField.js │ │ │ └── testUrlField.js │ │ │ └── group999FixMe │ │ │ ├── 2382.js │ │ │ ├── 2898.js │ │ │ ├── 2940.js │ │ │ ├── 2941.js │ │ │ ├── 2945.js │ │ │ ├── 3028.js │ │ │ ├── 3126.js │ │ │ └── testDependsOnField_issue3068.js │ ├── adminuiCustom │ │ ├── favicon.ico │ │ ├── styles.less │ │ └── variables.less │ ├── drivers │ │ └── chrome │ │ │ ├── linux32 │ │ │ └── .empty │ │ │ ├── linux64 │ │ │ └── .empty │ │ │ ├── mac32 │ │ │ └── .empty │ │ │ └── win32 │ │ │ └── .empty │ ├── frontend │ │ ├── index.html │ │ └── main.css │ ├── modelTestConfig │ │ ├── BooleanModelTestConfig.js │ │ ├── CloudinaryImageModelTestConfig.js │ │ ├── CloudinaryImageMultipleModelTestConfig.js │ │ ├── CodeModelTestConfig.js │ │ ├── ColorModelTestConfig.js │ │ ├── DateArrayModelTestConfig.js │ │ ├── DateModelTestConfig.js │ │ ├── DatetimeModelTestConfig.js │ │ ├── EmailModelTestConfig.js │ │ ├── FileModelTestConfig.js │ │ ├── GeoPointModelTestConfig.js │ │ ├── HtmlModelTestConfig.js │ │ ├── KeyModelTestConfig.js │ │ ├── LocationModelTestConfig.js │ │ ├── MarkdownModelTestConfig.js │ │ ├── MoneyModelTestConfig.js │ │ ├── NameModelTestConfig.js │ │ ├── NumberArrayModelTestConfig.js │ │ ├── NumberModelTestConfig.js │ │ ├── PasswordModelTestConfig.js │ │ ├── README.md │ │ ├── RelationshipModelTestConfig.js │ │ ├── SelectModelTestConfig.js │ │ ├── TextArrayModelTestConfig.js │ │ ├── TextModelTestConfig.js │ │ ├── TextareaModelTestConfig.js │ │ ├── UrlModelTestConfig.js │ │ └── UserModelTestConfig.js │ ├── models │ │ ├── Member.js │ │ ├── OtherList.js │ │ ├── SelectFieldOnInitial.js │ │ ├── User.js │ │ ├── fields │ │ │ ├── Boolean.js │ │ │ ├── CloudinaryImage.js │ │ │ ├── CloudinaryImageMultiple.js │ │ │ ├── Code.js │ │ │ ├── Color.js │ │ │ ├── Date.js │ │ │ ├── DateArray.js │ │ │ ├── Datetime.js │ │ │ ├── Email.js │ │ │ ├── File.js │ │ │ ├── GeoPoint.js │ │ │ ├── Html.js │ │ │ ├── Key.js │ │ │ ├── Location.js │ │ │ ├── Markdown.js │ │ │ ├── Money.js │ │ │ ├── Name.js │ │ │ ├── Number.js │ │ │ ├── NumberArray.js │ │ │ ├── Password.js │ │ │ ├── Relationship.js │ │ │ ├── Select.js │ │ │ ├── Text.js │ │ │ ├── TextArray.js │ │ │ ├── Textarea.js │ │ │ └── Url.js │ │ └── misc │ │ │ ├── DateFieldMap.js │ │ │ ├── DependsOn.js │ │ │ ├── HiddenRelationship.js │ │ │ ├── InlineRelationship.js │ │ │ ├── InvalidDefaultColumn.js │ │ │ ├── ManyRelationship.js │ │ │ ├── NoDefaultColumn.js │ │ │ ├── ReservedListKeyword.js │ │ │ ├── SourceRelationship.js │ │ │ └── TargetRelationship.js │ ├── routes │ │ └── index.js │ ├── server.js │ ├── updates │ │ ├── 0.0.1-updates-e2e.js │ │ └── 0.0.2-updates-e2e.js │ └── utils.js ├── helpers │ ├── certs │ │ ├── server.ca.key │ │ ├── server.crt │ │ └── server.csr │ ├── getExpressApp.js │ ├── getKeystoneApp.js │ ├── getMongooseConnection.js │ └── removeModel.js ├── mocha-admin.opts ├── mocha.opts ├── models │ ├── DependsOn.js │ └── Post.js ├── pretest.js └── unit │ ├── README.md │ ├── field-filters.js │ ├── field-types.js │ ├── field-utils.js │ ├── lib │ ├── email.js │ ├── list │ │ ├── autokey.js │ │ ├── dependsOn.js │ │ └── pagination.js │ ├── middleware │ │ └── language.js │ ├── path.js │ ├── safeRequire.js │ ├── security.js │ ├── security │ │ └── frame-guard.js │ ├── session.js │ └── view.js │ ├── module-root.js │ ├── req-user.js │ ├── server │ └── initViewEngine.js │ └── track.js └── website ├── .babelrc ├── .eslintrc.js ├── components ├── Container.js ├── GithubButton.js ├── Grid │ ├── index.js │ └── widths.js ├── Header.js ├── Navbar │ ├── Brand.js │ ├── Item.js │ ├── Menu.js │ ├── index.js │ └── utils │ │ ├── index.js │ │ └── makeSection.js ├── Navigation.js ├── TwitterButton.js ├── Version5.js └── index.js ├── css ├── prism-coy.css └── styles.css ├── data └── navigation.js ├── gatsby-config.js ├── gatsby-node.js ├── images ├── brand-continental.png ├── brand-event_cinemas.png ├── brand-macmillan.png ├── brand-sony.png ├── brand-vodafone.png ├── brand-westpac.png ├── keystone_admin.png └── logo-inverted.svg ├── package.json ├── src ├── html.js ├── layouts │ ├── components │ │ └── Navbar.js │ └── default.js └── pages │ ├── 404.js │ ├── components │ └── home │ │ ├── AdminInterface.js │ │ ├── CommunityResponse.js │ │ ├── Footer.js │ │ ├── Hero.js │ │ ├── ValueProps.js │ │ ├── ValueProps2.js │ │ └── WhereNext.js │ └── index.js ├── static ├── _redirects ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── robots.txt └── sitemap.xml ├── templates ├── template-doc-layout.js └── template-doc-page.js ├── theme.js └── utils └── typography.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "@babel/plugin-transform-object-assign" 4 | ], 5 | "presets": [ 6 | "@babel/preset-react", 7 | "@babel/preset-env" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | --- 2 | engines: 3 | duplication: 4 | enabled: true 5 | config: 6 | languages: 7 | - javascript 8 | eslint: 9 | enabled: true 10 | config: 11 | config: .eslintrc 12 | fixme: 13 | enabled: true 14 | ratings: 15 | paths: 16 | - "**.js" 17 | exclude_paths: 18 | - node_modules/ 19 | - test/ 20 | - "**/test/" 21 | - admin/public/js/ 22 | - admin/public/fonts/ 23 | - fields/types/markdown/lib/ 24 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | root = true 4 | 5 | [*] 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | indent_style = tab 11 | 12 | [*.js] 13 | indent_size = 2 14 | 15 | [*.json] 16 | indent_style = space 17 | indent_size = 2 18 | 19 | [*.yml] 20 | indent_style = space 21 | indent_size = 2 22 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | admin/bundles/* 2 | admin/public/js/lib/* 3 | admin/public/js/packages.js 4 | bundles/* 5 | coverage/* 6 | docs/* 7 | fields/types/**/lib/* 8 | node_modules/* 9 | test/* 10 | website/* 11 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "keystone-react" 4 | ], 5 | "rules": { 6 | "react/jsx-no-bind": 0 7 | }, 8 | "globals": { 9 | "_": true, 10 | "$": true, 11 | "after": true, 12 | "afterEach": true, 13 | "before": true, 14 | "beforeEach": true, 15 | "describe": true, 16 | "it": true, 17 | "jQuery": true, 18 | "Keystone": true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.dat 2 | *.DS_Store 3 | *.gz 4 | *.log 5 | *.out 6 | *.pid 7 | *.seed 8 | *.swp 9 | *.un~ 10 | *.iml 11 | *.ipr 12 | *.iws 13 | .idea/ 14 | *.sublime-* 15 | 16 | logs 17 | node_modules/ 18 | npm-debug.log 19 | pids 20 | results 21 | coverage 22 | coverage.html 23 | .cover* 24 | lib-cov 25 | 26 | bundles 27 | docs/_dist 28 | admin/public/styles/auth.css 29 | admin/public/styles/auth.min.css 30 | admin/public/styles/keystone.css 31 | admin/public/styles/keystone.min.css 32 | reports 33 | 34 | test/e2e/drivers/* 35 | 36 | package-lock.json 37 | yarn.lock 38 | 39 | # Website dependencies 40 | website/.cache 41 | website/public 42 | 43 | .vscode 44 | 45 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | docs 2 | examples 3 | /test/ 4 | -------------------------------------------------------------------------------- /admin/client/App/components/Navigation/Mobile/ListItem.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A list item of the mobile navigation 3 | */ 4 | 5 | import React from 'react'; 6 | import { Link } from 'react-router'; 7 | 8 | const MobileListItem = React.createClass({ 9 | displayName: 'MobileListItem', 10 | propTypes: { 11 | children: React.PropTypes.node.isRequired, 12 | className: React.PropTypes.string, 13 | href: React.PropTypes.string.isRequired, 14 | onClick: React.PropTypes.func, 15 | }, 16 | render () { 17 | return ( 18 | 24 | {this.props.children} 25 | 26 | ); 27 | }, 28 | }); 29 | 30 | module.exports = MobileListItem; 31 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Alert/colors.js: -------------------------------------------------------------------------------- 1 | import theme from '../../../theme'; 2 | 3 | module.exports = { 4 | danger: theme.alert.color.danger, 5 | error: theme.alert.color.danger, 6 | info: theme.alert.color.info, 7 | success: theme.alert.color.success, 8 | warning: theme.alert.color.warning, 9 | }; 10 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Center/index.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import { css } from 'glamor'; 3 | import classes from './styles'; 4 | 5 | function Center ({ 6 | className, 7 | component: Component, 8 | height, 9 | style, 10 | ...props 11 | }) { 12 | props.className = css(classes.center, className); 13 | props.style = { height, ...style }; 14 | 15 | return ; 16 | }; 17 | Center.propTypes = { 18 | component: PropTypes.oneOfType([ 19 | PropTypes.func, 20 | PropTypes.string, 21 | ]), 22 | height: PropTypes.oneOfType([ 23 | PropTypes.number, 24 | PropTypes.string, 25 | ]), 26 | }; 27 | Center.defaultProps = { 28 | component: 'div', 29 | height: 'auto', 30 | }; 31 | 32 | module.exports = Center; 33 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Center/styles.js: -------------------------------------------------------------------------------- 1 | // ============================== 2 | // Center 3 | // ============================== 4 | 5 | module.exports = { 6 | center: { 7 | display: 'flex', 8 | alignItems: 'center', 9 | justifyContent: 'center', 10 | }, 11 | }; 12 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Container/sizes.js: -------------------------------------------------------------------------------- 1 | import theme from '../../../theme'; 2 | 3 | module.exports = { 4 | small: theme.container.size.small, 5 | medium: theme.container.size.medium, 6 | large: theme.container.size.large, 7 | }; 8 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Form/styles.js: -------------------------------------------------------------------------------- 1 | // ============================== 2 | // Form 3 | // ============================== 4 | 5 | module.exports = { 6 | Form: {}, 7 | }; 8 | -------------------------------------------------------------------------------- /admin/client/App/elemental/FormNote/styles.js: -------------------------------------------------------------------------------- 1 | // ============================== 2 | // Form Note 3 | // ============================== 4 | 5 | import theme from '../../../theme'; 6 | 7 | module.exports = { 8 | note: { 9 | color: theme.form.note.color, 10 | fontSize: theme.form.note.fontSize, 11 | marginTop: theme.spacing.small, 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Glyph/colors.js: -------------------------------------------------------------------------------- 1 | import theme from '../../../theme'; 2 | 3 | module.exports = { 4 | danger: theme.glyph.color.danger, 5 | inherit: theme.glyph.color.inherit, 6 | inverted: theme.glyph.color.inverted, 7 | primary: theme.glyph.color.primary, 8 | success: theme.glyph.color.success, 9 | warning: theme.glyph.color.warning, 10 | }; 11 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Glyph/sizes.js: -------------------------------------------------------------------------------- 1 | import theme from '../../../theme'; 2 | 3 | module.exports = { 4 | small: theme.glyph.size.small, 5 | medium: theme.glyph.size.medium, 6 | large: theme.glyph.size.large, 7 | }; 8 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Glyph/styles.js: -------------------------------------------------------------------------------- 1 | // ============================== 2 | // Glyph 3 | // ============================== 4 | 5 | import colors from './colors'; 6 | import sizes from './sizes'; 7 | 8 | // Prepare variants 9 | const colorVariants = {}; 10 | Object.keys(colors).forEach(color => { 11 | colorVariants[`color__${color}`] = { 12 | color: colors[color], 13 | }; 14 | }); 15 | 16 | // Prepare sizes 17 | const sizeVariants = {}; 18 | Object.keys(sizes).forEach(size => { 19 | sizeVariants[`size__${size}`] = { 20 | fontSize: sizes[size], 21 | }; 22 | }); 23 | 24 | module.exports = { 25 | glyph: {}, 26 | 27 | // Colors 28 | ...colorVariants, 29 | 30 | // Sizes 31 | ...sizeVariants, 32 | }; 33 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Grid/index.js: -------------------------------------------------------------------------------- 1 | import Col from '../GridCol'; 2 | import Row from '../GridRow'; 3 | 4 | export { Col, Row }; 5 | -------------------------------------------------------------------------------- /admin/client/App/elemental/LabelledControl/index.js: -------------------------------------------------------------------------------- 1 | import { css } from 'glamor'; 2 | import React, { PropTypes } from 'react'; 3 | import classes from './styles'; 4 | 5 | function LabelledControl ({ 6 | className, 7 | inline, 8 | label, 9 | title, 10 | ...props 11 | }) { 12 | const labelClassName = css( 13 | classes.wrapper, 14 | inline && classes.wrapper__inline, 15 | className 16 | ); 17 | 18 | return ( 19 | 23 | ); 24 | }; 25 | 26 | LabelledControl.propTypes = { 27 | inline: PropTypes.bool, 28 | title: PropTypes.string, 29 | type: PropTypes.oneOf(['checkbox', 'radio']).isRequired, 30 | }; 31 | 32 | module.exports = LabelledControl; 33 | -------------------------------------------------------------------------------- /admin/client/App/elemental/LabelledControl/styles.js: -------------------------------------------------------------------------------- 1 | // ============================== 2 | // Alert 3 | // ============================== 4 | 5 | /* eslint quote-props: ["error", "as-needed"] */ 6 | 7 | import theme from '../../../theme'; 8 | 9 | module.exports = { 10 | wrapper: { 11 | display: 'block', 12 | height: theme.input.height, 13 | lineHeight: theme.input.lineHeight, 14 | }, 15 | wrapper__inline: { 16 | display: 'inline', 17 | }, 18 | 19 | // checkbox or radio 20 | control: { 21 | marginRight: '0.5em', 22 | }, 23 | }; 24 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Modal/body.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { css } from 'glamor'; 3 | import theme from '../../../theme'; 4 | 5 | function ModalBody ({ 6 | className, 7 | ...props 8 | }) { 9 | return ( 10 |
14 | ); 15 | }; 16 | 17 | const classes = { 18 | body: { 19 | paddingBottom: theme.modal.padding.body.vertical, 20 | paddingLeft: theme.modal.padding.body.horizontal, 21 | paddingRight: theme.modal.padding.body.horizontal, 22 | paddingTop: theme.modal.padding.body.vertical, 23 | }, 24 | }; 25 | 26 | module.exports = ModalBody; 27 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Modal/index.js: -------------------------------------------------------------------------------- 1 | import Body from './body'; 2 | import Dialog from './dialog'; 3 | import Footer from './footer'; 4 | import Header from './header'; 5 | 6 | export { 7 | Body, 8 | Dialog, 9 | Footer, 10 | Header, 11 | }; 12 | -------------------------------------------------------------------------------- /admin/client/App/elemental/PassContext/index.js: -------------------------------------------------------------------------------- 1 | import { Children, Component, PropTypes } from 'react'; 2 | 3 | // Pass the Lightbox context through to the Portal's descendents 4 | // StackOverflow discussion http://goo.gl/oclrJ9 5 | 6 | class PassContext extends Component { 7 | getChildContext () { 8 | return this.props.context; 9 | } 10 | render () { 11 | return Children.only(this.props.children); 12 | } 13 | }; 14 | 15 | PassContext.propTypes = { 16 | context: PropTypes.object.isRequired, 17 | }; 18 | PassContext.childContextTypes = { 19 | onClose: PropTypes.func, 20 | }; 21 | 22 | export default PassContext; 23 | -------------------------------------------------------------------------------- /admin/client/App/elemental/ScreenReaderOnly/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { css } from 'glamor'; 3 | 4 | function ScreenReaderOnly ({ className, ...props }) { 5 | props.className = css(classes.srOnly, className); 6 | 7 | return ; 8 | }; 9 | 10 | const classes = { 11 | srOnly: { 12 | border: 0, 13 | clip: 'rect(0,0,0,0)', 14 | height: 1, 15 | margin: -1, 16 | overflow: 'hidden', 17 | padding: 0, 18 | position: 'absolute', 19 | width: 1, 20 | }, 21 | }; 22 | 23 | module.exports = ScreenReaderOnly; 24 | -------------------------------------------------------------------------------- /admin/client/App/elemental/SegmentedControl/colors.js: -------------------------------------------------------------------------------- 1 | import theme from '../../../theme'; 2 | 3 | module.exports = { 4 | danger: theme.color.danger, 5 | default: theme.color.gray80, 6 | error: theme.color.danger, 7 | info: theme.color.info, 8 | primary: theme.color.primary, 9 | success: theme.color.success, 10 | warning: theme.color.warning, 11 | }; 12 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Spinner/colors.js: -------------------------------------------------------------------------------- 1 | module.exports = ['danger', 'default', 'inverted', 'primary', 'success', 'warning']; 2 | -------------------------------------------------------------------------------- /admin/client/App/elemental/Spinner/sizes.js: -------------------------------------------------------------------------------- 1 | module.exports = ['small', 'medium', 'large']; 2 | -------------------------------------------------------------------------------- /admin/client/App/screens/Home/constants.js: -------------------------------------------------------------------------------- 1 | export const LOAD_COUNTS = 'app/Home/LOAD_COUNTS'; 2 | export const COUNTS_LOADING_SUCCESS = 'app/Home/COUNTS_LOADING_SUCCESS'; 3 | export const COUNTS_LOADING_ERROR = 'app/Home/COUNTS_LOADING_ERROR'; 4 | -------------------------------------------------------------------------------- /admin/client/App/screens/Home/reducer.js: -------------------------------------------------------------------------------- 1 | import assign from 'object-assign'; 2 | import { 3 | LOAD_COUNTS, 4 | COUNTS_LOADING_SUCCESS, 5 | COUNTS_LOADING_ERROR, 6 | } from './constants'; 7 | 8 | const initialState = { 9 | counts: {}, 10 | loading: false, 11 | error: null, 12 | }; 13 | 14 | function home (state = initialState, action) { 15 | switch (action.type) { 16 | case LOAD_COUNTS: 17 | return assign({}, state, { 18 | loading: true, 19 | }); 20 | case COUNTS_LOADING_SUCCESS: 21 | return assign({}, state, { 22 | loading: false, 23 | counts: action.counts, 24 | error: null, 25 | }); 26 | case COUNTS_LOADING_ERROR: 27 | return assign({}, state, { 28 | loading: false, 29 | error: action.error, 30 | }); 31 | default: 32 | return state; 33 | } 34 | } 35 | 36 | export default home; 37 | -------------------------------------------------------------------------------- /admin/client/App/screens/Home/test/actions.test.js: -------------------------------------------------------------------------------- 1 | import demand from 'must'; 2 | import { 3 | countsLoaded, 4 | } from '../actions'; 5 | import { 6 | COUNTS_LOADING_SUCCESS, 7 | } from '../constants'; 8 | 9 | describe(' actions', () => { 10 | describe('countsLoaded()', () => { 11 | it('should return a type of COUNTS_LOADING_SUCCESS', () => { 12 | demand(countsLoaded().type).eql(COUNTS_LOADING_SUCCESS); 13 | }); 14 | 15 | it('should pass the counts on', () => { 16 | const counts = { 'some/path': 100 }; 17 | demand(countsLoaded(counts).counts).eql(counts); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /admin/client/App/screens/Home/utils/test/getRelatedIconClass.test.js: -------------------------------------------------------------------------------- 1 | import demand from 'must'; 2 | import getRelatedIconClass from '../getRelatedIconClass'; 3 | 4 | describe('getRelatedIconClass', () => { 5 | it('should return "octicon-primitive-dot" by default', () => { 6 | demand(getRelatedIconClass('')).eql('octicon octicon-primitive-dot'); 7 | }); 8 | 9 | it('should return a related icon class', () => { 10 | demand(getRelatedIconClass('times')).eql('octicon octicon-clock'); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /admin/client/App/screens/Item/components/FormHeading.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import evalDependsOn from '../../../../../../fields/utils/evalDependsOn'; 3 | 4 | module.exports = React.createClass({ 5 | displayName: 'FormHeading', 6 | propTypes: { 7 | options: React.PropTypes.object, 8 | }, 9 | render () { 10 | if (!evalDependsOn(this.props.options.dependsOn, this.props.options.values)) { 11 | return null; 12 | } 13 | return

{this.props.content}

; 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /admin/client/App/screens/Item/components/Toolbar/ToolbarSection.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import classNames from 'classnames'; 3 | 4 | function ToolbarSection ({ className, left, right, ...props }) { 5 | props.className = classNames('Toolbar__section', { 6 | 'Toolbar__section--left': left, 7 | 'Toolbar__section--right': right, 8 | }, className); 9 | 10 | return
; 11 | }; 12 | 13 | ToolbarSection.propTypes = { 14 | left: PropTypes.bool, 15 | right: PropTypes.bool, 16 | }; 17 | 18 | module.exports = ToolbarSection; 19 | -------------------------------------------------------------------------------- /admin/client/App/screens/Item/components/Toolbar/index.js: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | 3 | const Toolbar = (props) =>
; 4 | 5 | Toolbar.displayName = 'Toolbar'; 6 | Toolbar.propTypes = { 7 | children: PropTypes.node.isRequired, 8 | }; 9 | 10 | module.exports = Toolbar; 11 | -------------------------------------------------------------------------------- /admin/client/App/screens/Item/components/Toolbar/test/Toolbar.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { shallow } from 'enzyme'; 3 | import demand from 'must'; 4 | import Toolbar from '../'; 5 | 6 | describe('', () => { 7 | it('should render a div', () => { 8 | const component = shallow(); 9 | demand(component.find('div').length).eql(1); 10 | }); 11 | 12 | it('should have a class of Toolbar', () => { 13 | const component = shallow(); 14 | demand(component.find('div').prop('className')).eql('Toolbar'); 15 | }); 16 | 17 | it('should render its children', () => { 18 | const children = (

Hello World!

); 19 | const component = shallow( 20 | {children} 21 | ); 22 | 23 | demand(component.contains(children)).true(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /admin/client/App/screens/Item/components/test/AltText.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import demand from 'must'; 3 | import AltText from '../AltText'; 4 | import { shallow } from 'enzyme'; 5 | 6 | describe('', () => { 7 | it('should render a span by default', () => { 8 | const component = shallow(); 9 | demand(component.find('span').length).gt(0); 10 | }); 11 | 12 | it('should render a different component if passed in', () => { 13 | const passed = 'div'; 14 | const component = shallow(); 15 | demand(component.find(passed).length).gt(0); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /admin/client/App/screens/Item/components/test/FormHeading.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import demand from 'must'; 3 | import FormHeading from '../FormHeading'; 4 | import { shallow } from 'enzyme'; 5 | 6 | // Does not test evalDependsOn since that's already tested 7 | describe('', () => { 8 | it('should render an h3', () => { 9 | const component = shallow( 10 | 11 | ); 12 | demand(component.find('h3').length).eql(1); 13 | }); 14 | 15 | it('should render its content', () => { 16 | const content = 'Hello World!'; 17 | const component = shallow( 18 | 19 | ); 20 | demand(component.contains(content)).true(); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /admin/client/App/screens/Item/constants.js: -------------------------------------------------------------------------------- 1 | export const SELECT_ITEM = 'app/Item/SELECT_ITEM'; 2 | export const LOAD_DATA = 'app/Item/LOAD_DATA'; 3 | export const DATA_LOADING_SUCCESS = 'app/Item/DATA_LOADING_SUCCESS'; 4 | export const DATA_LOADING_ERROR = 'app/Item/DATA_LOADING_ERROR'; 5 | export const DRAG_MOVE_ITEM = 'app/Item/DRAG_MOVE_ITEM'; 6 | export const DRAG_RESET_ITEMS = 'app/Item/DRAG_RESET_ITEMS'; 7 | export const LOAD_RELATIONSHIP_DATA = 'app/Item/LOAD_RELATIONSHIP_DATA'; 8 | export const ASYNC_FIELD_LOADING = 'loading'; 9 | export const ASYNC_FIELD_LOADED = 'loaded'; 10 | -------------------------------------------------------------------------------- /admin/client/App/screens/List/actions/test/actions.test.js: -------------------------------------------------------------------------------- 1 | import demand from 'must'; 2 | import { 3 | setCurrentPage, 4 | } from '../'; 5 | import { 6 | SET_CURRENT_PAGE, 7 | } from '../../constants'; 8 | 9 | describe(' actions', () => { 10 | describe('setCurrentPage', () => { 11 | it('should have a type of SET_CURRENT_PAGE', () => { 12 | demand(setCurrentPage().type).eql(SET_CURRENT_PAGE); 13 | }); 14 | 15 | it('should pass on the page index', () => { 16 | const index = 25; 17 | demand(setCurrentPage(index).index).eql(index); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /admin/client/App/screens/List/actions/test/items.test.js: -------------------------------------------------------------------------------- 1 | import demand from 'must'; 2 | import { 3 | itemsLoaded, 4 | } from '../items'; 5 | import { 6 | ITEMS_LOADED, 7 | } from '../../constants'; 8 | 9 | describe(' items actions', () => { 10 | describe('itemsLoaded()', () => { 11 | it('should have a type of ITEMS_LOADED', () => { 12 | demand(itemsLoaded().type).eql(ITEMS_LOADED); 13 | }); 14 | 15 | it('should pass on the items', () => { 16 | const items = [{ some: 'item' }]; 17 | demand(itemsLoaded(items).items).eql(items); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /admin/client/App/shared/InvalidFieldType.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Renders an "Invalid Field Type" error 3 | */ 4 | 5 | import React from 'react'; 6 | 7 | const InvalidFieldType = function (props) { 8 | return ( 9 |
10 | Invalid field type {props.type} at path {props.path} 11 |
12 | ); 13 | }; 14 | 15 | InvalidFieldType.propTypes = { 16 | path: React.PropTypes.string, 17 | type: React.PropTypes.string, 18 | }; 19 | 20 | module.exports = InvalidFieldType; 21 | -------------------------------------------------------------------------------- /admin/client/App/shared/Popout/PopoutBody.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Render the body of a popout 3 | */ 4 | 5 | import React from 'react'; 6 | import blacklist from 'blacklist'; 7 | import classnames from 'classnames'; 8 | 9 | var PopoutBody = React.createClass({ 10 | displayName: 'PopoutBody', 11 | propTypes: { 12 | children: React.PropTypes.node.isRequired, 13 | className: React.PropTypes.string, 14 | scrollable: React.PropTypes.bool, 15 | }, 16 | render () { 17 | const className = classnames('Popout__body', { 18 | 'Popout__scrollable-area': this.props.scrollable, 19 | }, this.props.className); 20 | const props = blacklist(this.props, 'className', 'scrollable'); 21 | 22 | return ( 23 |
24 | ); 25 | }, 26 | }); 27 | 28 | module.exports = PopoutBody; 29 | -------------------------------------------------------------------------------- /admin/client/App/shared/Popout/PopoutListHeading.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Render a popout list heading 3 | */ 4 | 5 | import React from 'react'; 6 | import blacklist from 'blacklist'; 7 | import classnames from 'classnames'; 8 | 9 | var PopoutListHeading = React.createClass({ 10 | displayName: 'PopoutListHeading', 11 | propTypes: { 12 | children: React.PropTypes.node.isRequired, 13 | className: React.PropTypes.string, 14 | }, 15 | render () { 16 | const className = classnames('PopoutList__heading', this.props.className); 17 | const props = blacklist(this.props, 'className'); 18 | 19 | return ( 20 |
21 | ); 22 | }, 23 | }); 24 | 25 | module.exports = PopoutListHeading; 26 | -------------------------------------------------------------------------------- /admin/client/App/shared/test/CreateForm.test.js: -------------------------------------------------------------------------------- 1 | // import React from 'react'; 2 | // import { shallow } from 'enzyme'; 3 | // import demand from 'must'; 4 | // import CreateForm from '../CreateForm'; 5 | // import { Modal, Form } from 'elemental'; 6 | // 7 | // describe('', () => { 8 | // beforeEach(() => { 9 | // global.Keystone = { 10 | // csrf: { 11 | // key: 'something', 12 | // value: 'else', 13 | // }, 14 | // }; 15 | // }); 16 | // 17 | // it('should render a Modal', () => { 18 | // const component = shallow(); 19 | // demand(component.find(Modal).length).equal(1); 20 | // }); 21 | // 22 | // it('should render a Form if it\'s open', () => { 23 | // const component = shallow(); 24 | // demand(component.find(Form).length).equal(1); 25 | // }); 26 | // }); 27 | -------------------------------------------------------------------------------- /admin/client/App/shared/test/InvalidFieldType.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { shallow } from 'enzyme'; 3 | import demand from 'must'; 4 | import InvalidFieldType from '../InvalidFieldType'; 5 | 6 | describe('', () => { 7 | it('should render a message saying that a field type is invalid', () => { 8 | const type = 'txt'; 9 | const path = 'some/path'; 10 | const component = shallow(); 11 | 12 | demand(component.text()).eql(`Invalid field type ${type} at path ${path}`); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /admin/client/App/shared/test/Portal.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { shallow } from 'enzyme'; 3 | import demand from 'must'; 4 | import Portal from '../Portal'; 5 | 6 | describe('', () => { 7 | it('should return null', () => { 8 | const component = shallow(); 9 | demand(component.type()).eql(null); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /admin/client/constants.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Constants 3 | */ 4 | 5 | // breakpoints 6 | exports.breakpoint = { 7 | xs: 480, 8 | sm: 768, 9 | md: 992, 10 | lg: 1200, 11 | }; 12 | 13 | // border radii 14 | exports.borderRadius = { 15 | xs: 2, 16 | sm: 4, 17 | md: 8, 18 | lg: 16, 19 | xl: 32, 20 | }; 21 | 22 | // color 23 | exports.color = { 24 | appDanger: '#d64242', 25 | appInfo: '#56cdfc', 26 | appPrimary: '#1385e5', 27 | appSuccess: '#34c240', 28 | appWarning: '#fa9f47', 29 | }; 30 | 31 | // spacing 32 | exports.spacing = { 33 | xs: 5, 34 | sm: 10, 35 | md: 20, 36 | lg: 40, 37 | xl: 80, 38 | }; 39 | 40 | // table constants 41 | 42 | exports.TABLE_CONTROL_COLUMN_WIDTH = 26; // icon + padding 43 | exports.NETWORK_ERROR_RETRY_DELAY = 500; // in ms 44 | -------------------------------------------------------------------------------- /admin/client/utils/cloudinaryResize.js: -------------------------------------------------------------------------------- 1 | import url from 'cloudinary-microurl'; 2 | const CLOUD_NAME = window.Keystone.cloudinary.cloud_name; 3 | 4 | /* 5 | Take a cloudinary public id + options object 6 | and return a url 7 | */ 8 | function cloudinaryResize (publicId, options = {}) { 9 | if (!publicId || !CLOUD_NAME) return false; 10 | 11 | return url(publicId, { 12 | cloud_name: CLOUD_NAME, // single cloud for the admin UI 13 | quality: 80, // 80% quality, which ~halves image download size 14 | ...options, 15 | }); 16 | }; 17 | 18 | module.exports = cloudinaryResize; 19 | -------------------------------------------------------------------------------- /admin/client/utils/concatClassnames.js: -------------------------------------------------------------------------------- 1 | // ====================== 2 | // Concatenate Classnames 3 | // ====================== 4 | // 5 | // Support className as an array: 6 | // force classname prop into an array (possibly of arrays) then flatten 7 | 8 | /* 9 | // To use spread the new array into glamor's `css` function 10 | 11 | function Component ({ className, ...props }) { 12 | props.className = css( 13 | classes.component, 14 | ...concatClassnames(className) 15 | ); 16 | 17 | return ; 18 | }; 19 | */ 20 | 21 | module.exports = function concatClassnames (className) { 22 | return [className].reduce((a, b) => { 23 | return a.concat(b); 24 | }, []); 25 | }; 26 | -------------------------------------------------------------------------------- /admin/client/utils/lists.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Exports an object of lists, keyed with their key instead of their name and 3 | * wrapped with the List helper (./List.js) 4 | */ 5 | 6 | import List from './List'; 7 | 8 | exports.listsByKey = {}; 9 | exports.listsByPath = {}; 10 | 11 | for (const key in Keystone.lists) { 12 | // Guard for-ins 13 | if ({}.hasOwnProperty.call(Keystone.lists, key)) { 14 | var list = new List(Keystone.lists[key]); 15 | exports.listsByKey[key] = list; 16 | exports.listsByPath[list.path] = list; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /admin/public/fonts/octicons/octicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/fonts/octicons/octicons.eot -------------------------------------------------------------------------------- /admin/public/fonts/octicons/octicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/fonts/octicons/octicons.ttf -------------------------------------------------------------------------------- /admin/public/fonts/octicons/octicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/fonts/octicons/octicons.woff -------------------------------------------------------------------------------- /admin/public/images/datepicker-select-handler.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /admin/public/images/icons/16/alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/alert.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/checkbox-checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/checkbox-checked.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/checkbox-unchecked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/checkbox-unchecked.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/cross.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-bold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-bold.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-code.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-image.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-indent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-indent.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-italic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-italic.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-link.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-list-order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-list-order.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-list.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-outdent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-outdent.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/edit-size.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/edit-size.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/exclamation.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-boolean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-boolean.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-code.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-colour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-colour.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-date.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-date.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-dateTime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-dateTime.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-email.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-facebook.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-file.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-geoArea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-geoArea.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-html.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-image.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-key.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-location.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-minutes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-minutes.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-money.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-money.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-mp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-mp3.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-name.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-number.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-numericSelect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-numericSelect.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-password.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-phone.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-select.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-sort.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-text.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-textarea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-textarea.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-textile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-textile.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/field-url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/field-url.png -------------------------------------------------------------------------------- /admin/public/images/icons/16/tick-circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/16/tick-circle.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/_blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/_blank.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/_page.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/aac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/aac.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/ai.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/aiff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/aiff.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/avi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/avi.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/bmp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/bmp.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/c.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/cpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/cpp.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/css.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/css.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/dat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/dat.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/dmg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/dmg.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/doc.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/dotx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/dotx.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/dwg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/dwg.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/dxf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/dxf.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/eps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/eps.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/exe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/exe.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/flv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/flv.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/gif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/gif.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/h.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/hpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/hpp.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/html.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/ics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/ics.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/iso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/iso.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/java.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/jpg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/jpg.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/js.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/key.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/less.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/less.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/mid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/mid.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/mp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/mp3.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/mp4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/mp4.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/mpg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/mpg.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/odf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/odf.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/ods.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/ods.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/odt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/odt.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/otp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/otp.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/ots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/ots.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/ott.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/ott.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/pdf.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/php.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/php.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/png.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/ppt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/ppt.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/psd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/psd.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/py.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/py.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/qt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/qt.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/rar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/rar.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/rb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/rb.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/rtf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/rtf.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/sass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/sass.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/scss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/scss.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/sql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/sql.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/tga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/tga.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/tgz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/tgz.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/tiff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/tiff.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/txt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/txt.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/wav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/wav.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/xls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/xls.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/xlsx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/xlsx.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/xml.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/yml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/yml.png -------------------------------------------------------------------------------- /admin/public/images/icons/32/zip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/icons/32/zip.png -------------------------------------------------------------------------------- /admin/public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/admin/public/images/logo.png -------------------------------------------------------------------------------- /admin/public/styles/content/editor.min.css: -------------------------------------------------------------------------------- 1 | .ks-editable-btn{background:rgba(255,255,255,0.75);border-radius:5px;border:1px solid rgba(0,0,0,0.5);color:#666;cursor:pointer;display:inline-block;font-size:13px;font-weight:normal;line-height:16px;padding:5px 10px;position:absolute;text-align:center;text-decoration:none;text-transform:uppercase;vertical-align:middle;white-space:nowrap}.ks-editable-btn:active,.ks-editable-btn:hover,.ks-editable-btn:focus{background:white;border:1px solid #000;color:black;text-decoration:none}.ks-editable-btn.active{background-image:none;box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);outline:0} -------------------------------------------------------------------------------- /admin/public/styles/error.css: -------------------------------------------------------------------------------- 1 | /* 2 | Generic Errors 3 | */ 4 | 5 | html { 6 | font-size: 62.5%; 7 | } 8 | body { 9 | background-color: #f6f6f6; 10 | color: #888; 11 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 12 | font-size: 16px; 13 | font-size: 1.6rem; 14 | font-weight: 300; 15 | line-height: 1.42857143; 16 | height: 80%; 17 | margin: 0; 18 | } 19 | 20 | /* center the error */ 21 | .error { 22 | margin: 0 auto; 23 | max-width: 600px; 24 | position: relative; 25 | width: 90%; 26 | top: 50%; 27 | 28 | -webkit-transform: translate(0, -50%); 29 | -ms-transform: translate(0, -50%); 30 | transform: translate(0, -50%); 31 | } 32 | 33 | h1, h2, h3 { 34 | font-weight: 300; 35 | } 36 | h1 { 37 | font-size: 1.5em; 38 | } 39 | h2 { 40 | font-size: 1.25em; 41 | } 42 | h3 { 43 | font-size: 1.1em; 44 | } 45 | -------------------------------------------------------------------------------- /admin/public/styles/keystone/animation.less: -------------------------------------------------------------------------------- 1 | // 2 | // Generic Animations 3 | // ============================== 4 | 5 | 6 | 7 | 8 | // Fade 9 | // ------------------------------ 10 | 11 | .react-transitiongroup-fade-enter { 12 | .animation( fadeIn 200ms ); 13 | } 14 | .react-transitiongroup-fade-leave { 15 | .animation( fadeOut 200ms ); 16 | } -------------------------------------------------------------------------------- /admin/public/styles/keystone/field-localfile.less: -------------------------------------------------------------------------------- 1 | // 2 | // Local File 3 | // ============================== 4 | 5 | .field-type-localfiles { 6 | .sortable-placeholder { 7 | border: 1px dashed #777; 8 | background: none; 9 | margin-top: 0px; 10 | margin-left: 0px; 11 | margin-right: 10px; 12 | margin-bottom: 0px; 13 | float: left; 14 | } 15 | .file-sortable { 16 | position: relative; 17 | float:left; 18 | cursor:pointer; 19 | min-width: 80px; 20 | min-height: 80px; 21 | margin-left: 0px; 22 | margin-right: 10px; 23 | } 24 | .file-preview.remove { 25 | img { 26 | opacity: .3; 27 | } 28 | } 29 | .delete-pending { 30 | position: absolute; 31 | font-size: 1.7em; 32 | left:50%; 33 | top:50%; 34 | margin-left:-13px; 35 | margin-top:-44px; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /admin/public/styles/keystone/list-sort.less: -------------------------------------------------------------------------------- 1 | // 2 | // List Sorting 3 | // ============================== 4 | 5 | 6 | 7 | 8 | // Buttons 9 | // ------------------------------ 10 | 11 | .ItemList__sort-button { 12 | background: none; 13 | border: none; 14 | padding: 0; 15 | } 16 | -------------------------------------------------------------------------------- /admin/public/styles/keystone/toolbar.less: -------------------------------------------------------------------------------- 1 | // 2 | // Toolbar 3 | // ============================== 4 | 5 | 6 | 7 | 8 | // Base 9 | 10 | .Toolbar { 11 | .clearfix(); 12 | border-bottom: 1px dashed darken(@body-bg, 10%); 13 | margin-bottom: 2em; 14 | padding-bottom: 1em; 15 | padding-top: 1em; 16 | 17 | // clear the interior floats 18 | > .container { 19 | &:extend(.u-clearfix all); 20 | } 21 | } 22 | 23 | 24 | // Sections 25 | 26 | // remove the padding from Link style Buttons on either side to keep everything aligned correctly 27 | 28 | .Toolbar__section--left { 29 | float: left; 30 | 31 | > .Button--link:first-child { 32 | padding-left: 0; 33 | } 34 | } 35 | .Toolbar__section--right { 36 | float: right; 37 | 38 | > .Button--link:last-child { 39 | padding-right: 0; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /admin/server/api/counts.js: -------------------------------------------------------------------------------- 1 | var async = require('async'); 2 | 3 | module.exports = function (req, res) { 4 | var keystone = req.keystone; 5 | var counts = {}; 6 | async.each(keystone.lists, function (list, next) { 7 | list.model.count(function (err, count) { 8 | counts[list.key] = count; 9 | next(err); 10 | }); 11 | }, function (err) { 12 | if (err) return res.apiError('database error', err); 13 | return res.json({ 14 | counts: counts, 15 | }); 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /admin/server/api/item/sortOrder.js: -------------------------------------------------------------------------------- 1 | /* 2 | TODO: Needs Review and Spec 3 | */ 4 | 5 | var getList = require('../list/get'); 6 | 7 | module.exports = function (req, res) { 8 | var keystone = req.keystone; 9 | if (!keystone.security.csrf.validate(req)) { 10 | console.log('Refusing to reorder ' + req.list.key + ' ' + req.params.id + '; CSRF failure'); 11 | return res.apiError(403, 'invalid csrf'); 12 | } 13 | req.list.model.reorderItems(req.params.id, req.params.sortOrder, req.params.newOrder, function (err) { 14 | if (err) return res.apiError('database error', err); 15 | return getList(req, res); 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /admin/server/api/list/create.js: -------------------------------------------------------------------------------- 1 | module.exports = function (req, res) { 2 | var keystone = req.keystone; 3 | if (!keystone.security.csrf.validate(req)) { 4 | return res.apiError(403, 'invalid csrf'); 5 | } 6 | 7 | var item = new req.list.model(); 8 | req.list.updateItem(item, req.body, { 9 | files: req.files, 10 | ignoreNoEdit: true, 11 | user: req.user, 12 | }, function (err) { 13 | if (err) { 14 | var status = err.error === 'validation errors' ? 400 : 500; 15 | var error = err.error === 'database error' ? err.detail : err; 16 | return res.apiError(status, error); 17 | } 18 | res.json(req.list.getData(item)); 19 | }); 20 | }; 21 | -------------------------------------------------------------------------------- /admin/server/api/session/get.js: -------------------------------------------------------------------------------- 1 | function get (req, res) { 2 | return res.json({ user: req.user }); 3 | } 4 | 5 | module.exports = get; 6 | -------------------------------------------------------------------------------- /admin/server/api/session/signout.js: -------------------------------------------------------------------------------- 1 | function signout (req, res) { 2 | var keystone = req.keystone; 3 | if (!keystone.security.csrf.validate(req)) { 4 | return res.apiError(403, 'invalid csrf'); 5 | } 6 | var user = req.user; 7 | keystone.callHook(user, 'pre:signout', function (err) { 8 | if (err) return res.status(500).json({ error: 'pre:signout error', detail: err }); 9 | res.clearCookie('keystone.uid'); 10 | req.user = null; 11 | req.session.regenerate(function (err) { 12 | if (err) return res.status(500).json({ error: 'session error', detail: err }); 13 | keystone.callHook(user, 'post:signout', function (err) { 14 | if (err) return res.status(500).json({ error: 'post:signout error', detail: err }); 15 | res.json({ success: true }); 16 | }); 17 | }); 18 | }); 19 | } 20 | 21 | module.exports = signout; 22 | -------------------------------------------------------------------------------- /admin/server/app/createHealthchecksHandler.js: -------------------------------------------------------------------------------- 1 | var safeRequire = require('../../../lib/safeRequire'); 2 | 3 | function createHealthchecksHandler (keystone) { 4 | var healthcheck = safeRequire('keystone-healthchecks', 'healthchecks'); 5 | var healthcheckConfig = keystone.get('healthchecks'); 6 | 7 | if (healthcheckConfig === true) { 8 | healthcheckConfig = {}; 9 | // By default, we simply bind the user model healthcheck if there is a 10 | // user model. This validates we can successfully query the database. 11 | if (keystone.get('user model')) { 12 | var User = keystone.list(keystone.get('user model')); 13 | healthcheckConfig.canQueryUsers = healthcheck.healthchecks.canQueryListFactory(User); 14 | } 15 | } 16 | 17 | return healthcheck.createRoute(healthcheckConfig); 18 | } 19 | 20 | module.exports = createHealthchecksHandler; 21 | -------------------------------------------------------------------------------- /admin/server/index.js: -------------------------------------------------------------------------------- 1 | exports.createDynamicRouter = require('./app/createDynamicRouter'); 2 | exports.createStaticRouter = require('./app/createStaticRouter'); 3 | -------------------------------------------------------------------------------- /admin/server/middleware/initList.js: -------------------------------------------------------------------------------- 1 | module.exports = function initList (req, res, next) { 2 | var keystone = req.keystone; 3 | req.list = keystone.list(req.params.list); 4 | if (!req.list) { 5 | if (req.headers.accept === 'application/json') { 6 | return res.status(404).json({ error: 'invalid list path' }); 7 | } 8 | req.flash('error', 'List ' + req.params.list + ' could not be found.'); 9 | return res.redirect('/' + keystone.get('admin path')); 10 | } 11 | next(); 12 | }; 13 | -------------------------------------------------------------------------------- /admin/server/middleware/logError.js: -------------------------------------------------------------------------------- 1 | module.exports = function (req, res, next) { 2 | res.logError = function logError (endpoint, description, err) { 3 | if (arguments.length === 2 && typeof description !== 'string') { 4 | err = description; 5 | description = null; 6 | } 7 | var msg = '[' + endpoint + ']'; 8 | msg += description ? ' ' + description + ':' : ' error:'; 9 | if (err) { 10 | console.log(msg, err.message, '\n' + err.stack); 11 | } else { 12 | console.log(msg); 13 | } 14 | }; 15 | next(); 16 | }; 17 | -------------------------------------------------------------------------------- /admin/server/routes/signout.js: -------------------------------------------------------------------------------- 1 | var session = require('../../../lib/session'); 2 | 3 | module.exports = function SignoutRoute (req, res) { 4 | var keystone = req.keystone; 5 | session.signout(req, res, function () { 6 | // After logging out, the user will be redirected to /signin?signedout 7 | // It shows a bar on top of the sign in panel saying "You have been signed out". 8 | if (typeof keystone.get('signout redirect') === 'string') { 9 | return res.redirect(keystone.get('signout redirect')); 10 | } else if (typeof keystone.get('signout redirect') === 'function') { 11 | return keystone.get('signout redirect')(req, res); 12 | } else { 13 | return res.redirect('/' + keystone.get('admin path') + '/signin?signedout'); 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /admin/server/templates/signin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Sign in to <%= brand %> 8 | 9 | 10 | 11 | 12 |
13 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /build.js: -------------------------------------------------------------------------------- 1 | var browserify = require('browserify'); 2 | 3 | var packages = require('./admin/client/packages'); 4 | var b = browserify({ 5 | debug: process.env.NODE_ENV !== 'production', 6 | }); 7 | packages.forEach(function (i) { b.require(i); }); 8 | b.bundle().pipe(process.stdout); 9 | -------------------------------------------------------------------------------- /docs/api/Field/Underscore-Methods.md: -------------------------------------------------------------------------------- 1 | # Underscore methods 2 | 3 | Many fields have special functions to allow you to manipulate data, which are referred to throughout the documentation called `underscore methods`. These allow specific actions to be called that relate to the data in that field. An example is the `password.compare` method. 4 | 5 | To access an underscore method, you can use an instance of the object. For example, if you have a user with a password field, you may want to access the compare method. 6 | 7 | Once you have retrieved a user from the database you can find the method at: 8 | 9 | ```js 10 | user._.password.compare() 11 | ``` 12 | 13 | > NOTE: Underscore Methods in Keystone have no relation to the javascript underscore library. 14 | -------------------------------------------------------------------------------- /docs/api/List/add.md: -------------------------------------------------------------------------------- 1 | # Add 2 | 3 | ## add(fields:Object, prefix:String) 4 | 5 | Adds fields to a [keystone List](/api/list/options). Must be used before [register()](/api/list/register). This takes an object with all of the fields, as well as a prefix option. The prefix will be added to the list's collection name in mongo. 6 | 7 | Example call: 8 | 9 | ```javascript 10 | var Cat = new keystone.List('Cat'); 11 | 12 | Cat.add({ 13 | name: { type: String }, 14 | age: { type: Number }, 15 | }); 16 | ``` 17 | 18 | Each field uses its key as the name of the field within the database. 19 | 20 | All fields must have a type, either `String`, `Number`, `Boolean`, or one of the defined [Keystone field types](/api/field) 21 | -------------------------------------------------------------------------------- /docs/api/List/model.md: -------------------------------------------------------------------------------- 1 | # Model 2 | 3 | Once you retrieve a list from Keystone, the [mongoose](http://mongoosejs.com/) methods can be accessed from `.model`. 4 | 5 | Example: 6 | 7 | ```javascript 8 | var User = require('keystone').list('User'); 9 | 10 | User.model.find({}); 11 | ``` 12 | 13 | See the mongoose [query](http://mongoosejs.com/docs/queries.html) documentation for more details on querying your database. 14 | -------------------------------------------------------------------------------- /docs/api/List/register.md: -------------------------------------------------------------------------------- 1 | # Register 2 | 3 | Adds a list to Keystone's know lists. 4 | 5 | This checks the options chosen for a list and validates them, and then makes them available through [keystone.list](/api/methods/list). Without register being run, the list will not be added to either Mongoose or Keystone. 6 | 7 | This should be run before [keystone.start](/api/methods/start) 8 | -------------------------------------------------------------------------------- /docs/api/List/schema.md: -------------------------------------------------------------------------------- 1 | # Schema 2 | 3 | The mongoose schema is accessible on new lists, and can be extended before the list is registered. 4 | 5 | The most common uses of this are to add pre-save, and post-save hooks, add a schema method, or to add a virtual field. See the mongoose documentation for more information: [mongoose schema docs](http://mongoosejs.com/docs/guide.html#options). 6 | 7 | Example: 8 | 9 | ```javascript 10 | User.schema.virtual('canAccessKeystone').get(function () { 11 | if (this.isAdmin) return true; 12 | }); 13 | ``` 14 | -------------------------------------------------------------------------------- /docs/api/Methods/closeDatabaseConnection.md: -------------------------------------------------------------------------------- 1 | # Close Database connection 2 | 3 | ## `keystone.closeDatabaseConnection(callback:Function)` 4 | 5 | Closes all database connections Keystone has open. 6 | -------------------------------------------------------------------------------- /docs/api/Methods/create-router.md: -------------------------------------------------------------------------------- 1 | # Create Router 2 | 3 | ## `var newRouter = keystone.createRouter()` 4 | 5 | Returns a new [express router](https://expressjs.com/en/4x/api.html#router) object. 6 | -------------------------------------------------------------------------------- /docs/api/Methods/get.md: -------------------------------------------------------------------------------- 1 | # Get 2 | 3 | ## `keystone.get(key:String)` 4 | 5 | Retrieve a property from Keystone's options. For information about Keystone's options, see [configuration](/documentation/configuration) documentation. 6 | 7 | This can be used to retrieve information about Keystone's running once it has started. 8 | 9 | Example: 10 | 11 | ```javascript 12 | keystone.get('env') 13 | ``` 14 | 15 | > NOTE: `keystone.get` is an alias for [keystone.set](/api/methods/set). As such, passing in a second argument will cause it to set the value of the Keystone option to the second argument before returning the value. 16 | -------------------------------------------------------------------------------- /docs/api/Methods/importer.md: -------------------------------------------------------------------------------- 1 | # Importer 2 | 3 | ## `keystone.importer(relativeDirName:String)` 4 | 5 | Returns a function that imports all javascript files in a directory, using the passed in directory as the relative path from which to make the search. 6 | 7 | Example: 8 | 9 | ```javascript 10 | var importRoutes = keystone.importer(__dirname); 11 | 12 | var routes = { 13 | views: importRoutes('./views'), 14 | }; 15 | 16 | exports = module.exports = function (app) { 17 | app.get('/', routes.views.index) 18 | }; 19 | ``` 20 | -------------------------------------------------------------------------------- /docs/api/Methods/init.md: -------------------------------------------------------------------------------- 1 | # Init 2 | 3 | ## `Keystone.init(options:Object)` 4 | 5 | `Keystone.init` provides initial options to Keystone. These are used to format and customise how Keystone runs. 6 | 7 | Some properties can be provided to init but not to [set](/api/methods/set): 8 | 9 | - cloudinary config 10 | - auth 11 | - nav 12 | - mongo 13 | - module root 14 | - app 15 | - mongoose 16 | - frame guard 17 | 18 | The initialization options can be found in the [configuration](/documentation/configuration) documentation. 19 | 20 | For information on setting up Keystone, see the [installation guide](/getting-started/setting-up/part-1) 21 | -------------------------------------------------------------------------------- /docs/api/Methods/list.md: -------------------------------------------------------------------------------- 1 | # list 2 | 3 | ## `keystone.list(listName:String)` 4 | 5 | A function used to retrieve a particular Keystone list, so that items can be retrieved from the database, and saved to the database. 6 | 7 | Example: 8 | 9 | ```javascript 10 | var User = require('keystone').list('User'); 11 | 12 | User.model.find({}, callback) 13 | ``` 14 | 15 | > NOTE: Keystone models use mongoose methods such as find undecorated. 16 | -------------------------------------------------------------------------------- /docs/api/Methods/openDatabaseConnection.md: -------------------------------------------------------------------------------- 1 | # Open Database Connection 2 | 3 | ## `keystone.openDatabaseConnection(callback:Function)` 4 | 5 | Opens a database connection using the options set in Keystone. If the Keystone database settings are not configured, or the models are not registered, this will fail. 6 | 7 | `openDatabaseConnection` is called by [start](/api/methods/start), and will be called before the express server is started. 8 | -------------------------------------------------------------------------------- /docs/api/Methods/pre.md: -------------------------------------------------------------------------------- 1 | # Pre 2 | 3 | ## `keystone.pre(actionName:String, desiredAction:Function)` 4 | 5 | Pre can be used to add some of the global middleware that Keystone can add. Most specifically, any with the `pre` prefix. For more information about adding middleware, see the [middleware documentation](/api/methods/middleware). 6 | -------------------------------------------------------------------------------- /docs/api/View/query.md: -------------------------------------------------------------------------------- 1 | # query 2 | 3 | `view.query(key:String, query:QueryObject[, options:Object])` 4 | 5 | Attaches a database query to be run before the render occurs, during the `queryQueue` run. The data returned from the query will be attached to the `locals` with the value of the key. 6 | 7 | Example: 8 | 9 | ```javascript 10 | var User = keystone.list('User'); 11 | 12 | view.query('currentUser', User.model.findOne({ name: req.body.name })); 13 | ``` 14 | 15 | This query will add the user with a matching name to `locals.currentUser` for use by the template in rendering. 16 | -------------------------------------------------------------------------------- /docs/api/index.md: -------------------------------------------------------------------------------- 1 | # API References 2 | 3 | ## Most Common Locations 4 | 5 | - [List](/api/list) 6 | - [Methods](/api/methods/close-database-connection) 7 | - [View](/api/view/on) 8 | - [Field Types](/api/field/options) 9 | -------------------------------------------------------------------------------- /docs/documentation/index.md: -------------------------------------------------------------------------------- 1 | # Documentation 2 | 3 | ## Most Common Locations 4 | 5 | - [Setting Keystone Options](/documentation/configuration) 6 | - [Database Configuration](/documentation/database) 7 | - [Adding Routes](/documentation/configuration/#adding-routes) 8 | - [Using Keystone Views](/api/view) 9 | 10 | If you want a quick run-down of setting up a Keystone project from scratch, with an explanation of the steps involved, you can see our [setting up](/getting-started/setting-up/part-1) information. 11 | -------------------------------------------------------------------------------- /docs/guides/assets/mailgun-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/docs/guides/assets/mailgun-dashboard.png -------------------------------------------------------------------------------- /docs/guides/assets/mailgun-go-to-auth-rep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keystonejs/keystone-classic/6e5ba1142a0909c64a1a38e20f31fcf9bed6e4db/docs/guides/assets/mailgun-go-to-auth-rep.png -------------------------------------------------------------------------------- /fields/components/CollapsedFieldLabel.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Button } from '../../admin/client/App/elemental'; 3 | 4 | // NOTE marginBottom of 1px stops things jumping around 5 | // TODO find out why this is necessary 6 | 7 | function CollapsedFieldLabel ({ style, ...props }) { 8 | const __style__ = { 9 | marginBottom: 1, 10 | paddingLeft: 0, 11 | paddingRight: 0, 12 | ...style, 13 | }; 14 | 15 | return ( 16 |