From 0732532a543a7b0ca2d58c89b19c2f5efc677a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Thu, 28 Sep 2017 23:29:34 +0200 Subject: [PATCH 01/55] Initial files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- developer_manual/conf.py | 4 +-- developer_manual/design/index.rst | 8 ++++++ developer_manual/design/navigation.rst | 34 ++++++++++++++++++++++++++ developer_manual/index.rst | 1 + 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 developer_manual/design/index.rst create mode 100644 developer_manual/design/navigation.rst diff --git a/developer_manual/conf.py b/developer_manual/conf.py index 2062e281a..cf0807356 100644 --- a/developer_manual/conf.py +++ b/developer_manual/conf.py @@ -48,9 +48,9 @@ copyright = u'2012-2017, The Nextcloud developers' # built documents. # # The short X.Y version. -version = '12' +version = '13' # The full version, including alpha/beta/rc tags. -release = '12' +release = '13' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/developer_manual/design/index.rst b/developer_manual/design/index.rst new file mode 100644 index 000000000..800af24fa --- /dev/null +++ b/developer_manual/design/index.rst @@ -0,0 +1,8 @@ +================= +Design Guidelines +================= + +.. toctree:: + :maxdepth: 2 + + navigation diff --git a/developer_manual/design/navigation.rst b/developer_manual/design/navigation.rst new file mode 100644 index 000000000..bf2571d1c --- /dev/null +++ b/developer_manual/design/navigation.rst @@ -0,0 +1,34 @@ +.. sectionauthor:: John Molakvoæ +.. codeauthor:: John Molakvoæ + +=============== +App Navigation +=============== + +Introduction +============= +The main navigation menu represent the most important part of your app. + +It needs to be: + +* Organised +* Simple +* Responsive + +Menus +====== + +Collapsible entry +================== + +Entry bullet +============= + +Undo entry +=========== + +Edit entry +=========== + +Pinned entry +============= diff --git a/developer_manual/index.rst b/developer_manual/index.rst index 8e1ffde09..f300334ee 100644 --- a/developer_manual/index.rst +++ b/developer_manual/index.rst @@ -16,6 +16,7 @@ Table of Contents general/index app/index + design/index android_library/index client_apis/index core/index From 77fc74e47ad70f09cff62f732334e9ced709ae34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Fri, 29 Sep 2017 08:30:09 +0200 Subject: [PATCH 02/55] Navigation 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- developer_manual/design/navigation.rst | 89 +++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/developer_manual/design/navigation.rst b/developer_manual/design/navigation.rst index bf2571d1c..d632ba0c3 100644 --- a/developer_manual/design/navigation.rst +++ b/developer_manual/design/navigation.rst @@ -7,6 +7,7 @@ App Navigation Introduction ============= + The main navigation menu represent the most important part of your app. It needs to be: @@ -15,12 +16,98 @@ It needs to be: * Simple * Responsive -Menus +Nextcloud provide a very organized way of building menus. +We implemented various essential functions and provide easy way of using them. + +Basic layout +============= + +.. code-block:: html + + + +Utils ====== +Each entry is allowed to have a counter and/or a button for user interraction. + +* The ``app-navigation-entry-utils`` snippet need to be placed right next to the main link of your entry. +* Maximum **two** items are allowed into the utils section. You can have: + * Two buttons + * One button and one counter +* You **can't** have more than two buttons, if you need more, you need to add a menu. +* The order of the button and the counter are **not** interchangeable. You need to put the counter before the menu. + +.. code-block:: html + +
+
    +
  • 1
  • +
  • + +
  • +
+
+ +Menu +^^^^^ + +If you need to add a few interractions for your entry, you can but everything in a popover menu. +The menu needs to be placed after the ``app-navigation-entry-utils``. + +.. code-block:: html + +
+ +
+ +Counter +^^^^^^^^ + +If you need to add a counter to your menu entry, you can simply use this structure. +Do not change the alignment of the text. If you're using + +.. code-block:: html + +
  • 1
  • + + + + Collapsible entry ================== + Entry bullet ============= From 625d8ab984fcac19058226ba8b93289198e23157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 3 Oct 2017 20:43:33 +0200 Subject: [PATCH 03/55] App development: Update getting started and app init docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- developer_manual/app/init.rst | 75 +++++++++++++++++++++---------- developer_manual/app/startapp.rst | 1 + 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/developer_manual/app/init.rst b/developer_manual/app/init.rst index 80cbec9f2..6f95e00ae 100644 --- a/developer_manual/app/init.rst +++ b/developer_manual/app/init.rst @@ -4,35 +4,30 @@ Navigation and Pre-App configuration .. sectionauthor:: Bernhard Posselt -The :file:`appinfo/app.php` is the first file that is loaded and executed in Nextcloud. Depending on the purpose of the app it usually just contains the navigation setup, and maybe :doc:`backgroundjobs` and :doc:`hooks` registrations. This is how an example :file:`appinfo/app.php` could look like: + +Adding a navigation entry +========================= + +Navigation entries for apps can be created by adding a navigation section to the :file:`appinfo/info.xml` file, containing the name, order and route the navigation entry should link to. For details on the XML schema check the `app store documentation `_. + +.. code-block:: xml + + + MyApp + myapp.page.index + 0 + + + +Further pre-app configuration +============================= + +The :file:`appinfo/app.php` is the first file that is loaded and executed in Nextcloud. Depending on the purpose of the app it is usually used to setup things that need to be available on every request to the server, like :doc:`backgroundjobs` and :doc:`hooks` registrations. This is how an example :file:`appinfo/app.php` could look like: .. code-block:: php getNavigationManager()->add(function () { - $urlGenerator = \OC::$server->getURLGenerator(); - return [ - // the string under which your app will be referenced in Nextcloud - 'id' => 'myapp', - - // sorting weight for the navigation. The higher the number, the higher - // will it be listed in the navigation - 'order' => 10, - - // the route that will be shown on startup - 'href' => $urlGenerator->linkToRoute('myapp.page.index'), - - // the icon that will be shown in the navigation - // this file needs to exist in img/ - 'icon' => $urlGenerator->imagePath('myapp', 'app.svg'), - - // the title of your application. This will be used in the - // navigation or on the settings page of your app - 'name' => \OC::$server->getL10N('myapp')->t('My App'), - ]; - }); - // execute OCA\MyApp\BackgroundJob\Task::run when cron is called \OC::$server->getJobList()->add('OCA\MyApp\BackgroundJob\Task'); @@ -48,3 +43,35 @@ Although it is also possible to include :doc:`js` or :doc:`css` for other apps b \OCP\Util::addScript('myapp', 'script'); // include js/script.js for every app \OCP\Util::addStyle('myapp', 'style'); // include css/style.css for every app + +Best practice +============= +A common way to have a cleaner code structure is to create a class Application in :file:`lib/AppInfo/Application.php` that will then execute your setup of hooks or background tasks. You can then just call it in your :file:`appinfo/app.php`. That way you can also make use of Nextclouds dependency injection feature and properly test those methods. + + +appinfo/app.php +--------------- + +.. code-block:: php + + registerHooks(); + + +lib/AppInfo/Application.php +--------------------------- + +.. code-block:: php + + Date: Tue, 3 Oct 2017 20:47:15 +0200 Subject: [PATCH 04/55] App development: Update info.xml documentation with the one from the app store docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- developer_manual/app/info.rst | 565 ++++++++++++++++++++-------------- 1 file changed, 340 insertions(+), 225 deletions(-) diff --git a/developer_manual/app/info.rst b/developer_manual/app/info.rst index 8bcecf2ea..9312e5e55 100644 --- a/developer_manual/app/info.rst +++ b/developer_manual/app/info.rst @@ -4,253 +4,368 @@ App Metadata .. sectionauthor:: Bernhard Posselt -The :file:`appinfo/info.xml` contains metadata about the app: +The :file:`appinfo/info.xml` contains metadata about the app. A detailed documentation can be found at the `app store documentation `_. + +The info.xml is validated using an XML Schema which can be accessed `online `_. + +A minimum valid **info.xml** would look like this: .. code-block:: xml - - - yourappname - Your App - Your App description - 1.0 - AGPL - Your Name - YourAppsNamespace + + + news + News + An RSS/Atom feed reader + An RSS/Atom feed reader + 8.8.2 + agpl + Bernhard Posselt + multimedia + https://github.com/nextcloud/news/issues + + + + - - - +A full blown example would look like this (needs to be utf-8 encoded): +.. code-block:: xml - - https://docs.nextcloud.org - https://docs.nextcloud.org - https://docs.nextcloud.org - + + + news + Nachrichten + News + An RSS/Atom feed reader + # Description\nAn RSS/Atom feed reader + + 8.8.2 + agpl + Bernhard Posselt + Alessandro Cosentino + Jan-Christoph Borchardt + + https://github.com/nextcloud/news/wiki#user-documentation + https://github.com/nextcloud/news#readme + https://github.com/nextcloud/news/wiki#developer-documentation + + multimedia + tools + https://github.com/nextcloud/news + https://your.forum.com + https://github.com/nextcloud/news/issues + https://github.com/nextcloud/news + https://example.com/1.png + https://example.com/2.jpg + + + pgsql + sqlite + mysql + grep + ls + libxml + curl + SimpleXML + iconv + + + + OCA\DAV\CardDAV\Sync\SyncJob + + + + OCA\DAV\Migration\Classification + + + OCA\DAV\Migration\Classification + + + OCA\DAV\Migration\GenerateBirthdays + + + OCA\DAV\Migration\GenerateBirthdays + + + OCA\DAV\Migration\GenerateBirthdays + + + + OCA\AuthF\TwoFactor\Provider + + + A\Php\Class + + + OCA\Theming\Settings\Admin + OCA\Theming\Settings\Section + + + + OCA\Files\Activity\Settings\FavoriteAction + OCA\Files\Activity\Settings\FileChanged + OCA\Files\Activity\Settings\FileCreated + OCA\Files\Activity\Settings\FileDeleted + OCA\Files\Activity\Settings\FileFavorite + OCA\Files\Activity\Settings\FileRestored + - tool + + OCA\Files\Activity\Filter\FileChanges + OCA\Files\Activity\Filter\Favorites + - https://example.org + + OCA\Files\Activity\FavoriteProvider + OCA\Files\Activity\Provider + + + + + files + Files + files.view.index + 0 + app.svg + link + + + + + OCA\Circles\Collaboration\v1\CollaboratorSearchPlugin + + + - https://github.com/nextcloud/theapp/issues - - https://github.com/nextcloud/theapp.git - - 1234 - - - - sqlite - mysql - grep - notepad.exe - xml - intl - curl - Linux - - - - - OCA\YourAppsNamespace\Settings\AdminSection - OCA\YourAppsNamespace\Settings\AdminSettings - - - - 5 - - appinfo/caldav.php - - - - appinfo/caldav.php - - - - - - true - - +The following tags are validated and used in the following way: id --- -**Required**: This field contains the internal app name, and has to be the same as the folder name of the app. This id needs to be unique in Nextcloud, meaning no other app should have this id. - + * required + * must contain only lowercase ASCII characters and underscore + * must match the first folder in the archive + * will be used to identify the app name ----- -**Required**: This is the human-readable name/title of the app that will be displayed in the app overview page. - + * required + * must occur at least once with **lang="en"** or no lang attribute + * can be translated by using multiple elements with different **lang** attribute values, language code needs to be set **lang** attribute + * will be rendered on the app detail page +summary + * optional + * if not provided the description element's text will be used + * must occur at least once with **lang="en"** or no lang attribute + * can be translated by using multiple elements with different **lang** attribute values, language code needs to be set **lang** attribute + * will be rendered on the app list page as short description description ------------ -**Required**: This contains the description of the app which will be shown in the app overview page. - + * required + * must occur at least once with **lang="en"** or no lang attribute + * can contain Markdown + * can be translated by using multiple elements with different **lang** attribute values, language code needs to be set **lang** attribute + * will be rendered on the app detail page version -------- -Contains the version of your app. - + * required + * must be a `semantic version `_ without build metadata, e.g. 9.0.1 or 9.1.0-alpha.1 licence -------- -**Required**: The licence of the app. This licence must be compatible with the AGPL and **must not be proprietary**, for instance: - -* AGPL 3 (recommended) -* MIT - + * required + * must contain **agpl**, **mpl*** and/or **apache** as the only valid values. These refer to the AGPLv3, MPL 2.0 and Apache License 2.0 author ------- -**Required**: The name of the app author or authors. - -namespace ---------- -Required if routes.php returns an array. If your app is namespaced like **\\OCA\\MyApp\\Controller\\PageController** the required namespace value is **MyApp**. If not given it tries to default to the first letter upper cased app id, e.g. **myapp** would be tried under **Myapp** - -types ------ -Nextcloud allows to specify four kind of ``types``. Currently supported ``types``: - -* **prelogin**: apps which need to load on the login page - -* **filesystem**: apps which provide filesystem functionality (e.g. files sharing app) - -* **authentication**: apps which provide authentication backends - -* **logging**: apps which implement a logging system - -* **prevent_group_restriction**: apps which can not be enabled for specific groups (e.g. notifications app). - -.. note:: - - Due to technical reasons apps of any type listed above can not be enabled for specific groups only. - -documentation -------------- -Link to 'admin', 'user', 'developer' documentation - -website -------- -Link to project web page - -repository ----------- -Link to the version control repo - -bugs ----- -Link to the bug tracker - + * required + * can occur multiple times with different authors + * can contain a **mail** attribute which must be an email + * can contain a **homepage** which must be an URL + * will not (yet) be rendered on the App Store + * will be provided through the REST API +documentation/user + * optional + * must contain an URL to the user documentation + * will be rendered on the app detail page +documentation/admin + * optional + * must contain an URL to the admin documentation + * will be rendered on the app detail page +documentation/developer + * optional + * must contain an URL to the developer documentation + * will be rendered on the app detail page category --------- -Category on the app store. Can be one of the following: + * optional + * if not provided the category **tools** will be used + * must contain one of the following values: -* auth -* customization -* files -* games -* integration -* monitoring -* multimedia -* office -* organization -* social -* tools + * **customization** + * **files** + * **games** + * **integration** + * **monitoring** + * **multimedia** + * **office** + * **organization** + * **security** + * **social** + * **tools** -ocsid ------ -The app's id on the app store, e.g.: https://apps.owncloud.com/content/show.php/QOwnNotes?content=168497 would have the ocsid **168497**. If given helps users to install and update the same app from the app store + * old categories are migrated: -Dependencies ------------- -All tags within the dependencies tag define a set of requirements which have to be fulfilled in order to operate -properly. As soon as one of these requirements is not met the app cannot be installed. + * **auth** will be converted to **security** -php -=== -Defines the minimum and the maximum version of PHP which is required to run this app. + * can occur more than once with different categories +website + * optional + * must contain an URL to the project's homepage + * will be rendered on the app detail page +discussion + * optional + * must contain an URL to the project's discussion page/forum + * will be rendered on the app detail page as the "ask question or discuss" button + * if absent, it will default to our forum at https://help.nextcloud.com/ and create a new category in the apps category +bugs + * required + * must contain an URL to the project's bug tracker + * will be rendered on the app detail page +repository + * optional + * must contain an URL to the project's repository + * can contain a **type** attribute, **git**, **mercurial**, **subversion** and **bzr** are allowed values, defaults to **git** + * currently not used +screenshot + * optional + * must contain an HTTPS URL to an image + * can contain a **small-thumbnail** attribute which must contain an https url to an image. This image will be used as small preview (e.g. on the app list overview). Keep it small so it renders fast + * will be rendered on the app list and detail page in the given order +dependencies/php + * optional + * can contain a **min-version** attribute (maximum 3 digits separated by dots) + * can contain a **max-version** attribute (maximum 3 digits separated by dots) + * can contain a **min-int-size** attribute, 32 or 64 are allowed as valid values + * will be rendered on the app releases page +dependencies/database + * optional + * must contain the database name as text, **sqlite**, **pgsql** and **mysql** are allowed as valid values + * can occur multiple times with different databases + * can contain a **min-version** attribute (maximum 3 digits separated by dots) + * can contain a **max-version** attribute (maximum 3 digits separated by dots) + * will be rendered on the app releases page +dependencies/command + * optional + * must contain a linux command as text value + * can occur multiple times with different commands + * will be rendered on the app releases page +dependencies/lib + * optional + * will be rendered on the app releases page + * must contain a required php extension + * can occur multiple times with different php extensions + * can contain a **min-version** attribute (maximum 3 digits separated by dots) + * can contain a **max-version** attribute (maximum 3 digits separated by dots) +dependencies/nextcloud + * required on Nextcloud 11 or higher + * if absent white-listed owncloud versions will be taken from the owncloud element (see below) + * must contain a **min-version** attribute (maximum 3 digits separated by dots) + * can contain a **max-version** attribute (maximum 3 digits separated by dots) +background-jobs/job + * optional + * must contain a php class which is run as background jobs + * will not be used, only validated +repair-steps/pre-migration/step + * optional + * must contain a php class which is run before executing database migrations + * will not be used, only validated +repair-steps/post-migration/step + * optional + * must contain a php class which is run after executing database migrations + * will not be used, only validated +repair-steps/live-migration/step + * optional + * must contain a php class which is run after executing post-migration jobs + * will not be used, only validated +repair-steps/install/step + * optional + * must contain a php class which is run after installing the app + * will not be used, only validated +repair-steps/uninstall/step + * optional + * must contain a php class which is run after uninstalling the app + * will not be used, only validated +two-factor-providers/provider + * optional + * must contain a php class which is registered as two factor auth provider + * will not be used, only validated +commands/command + * optional + * must contain a php class which is registered as occ command + * will not be used, only validated +activity/settings/setting + * optional + * must contain a php class which implements OCP\Activity\ISetting and is used to add additional settings ui elements to the activity app +activity/filters/filter + * optional + * must contain a php class which implements OCP\Activity\IFilter and is used to add additional filters to the activity app +activity/providers/provider + * optional + * must contain a php class which implements OCP\Activity\IProvider and is used to react to events from the activity app +settings/admin + * optional + * must contain a php class which implements OCP\Settings\ISettings and returns the form to render for the global settings area +settings/admin-section + * optional + * must contain a php class which implements OCP\Settings\ISection and returns data to render navigation entries in the global settings area +navigations + * optional + * must contain at least one navigation element +navigations/navigation + * required + * must contain a name and route element + * denotes a navigation entry + * role denotes the visibility, all means everyone can see it, admin means only an admin can see the navigation entry, defaults to all +navigations/navigation/id + * optional + * the app id + * you can also create entries for other apps by setting an id other than your app one's +navigations/navigation/name + * required + * will be displayed below the navigation entry icon + * will be translated by the default translation tools +navigations/navigation/route + * required + * name of the route that will be used to generate the link +navigations/navigation/icon + * optional + * name of the icon which is looked up in the app's **img/** folder + * defaults to app.svg +navigations/navigation/order + * optional + * used to sort the navigation entries + * a higher order number means that the entry will be ordered further to the bottom +navigations/navigation/type + * optional + * can be either link or settings + * link means that the entry is added to the default app menu + * settings means that the entry is added to the right-side menu which also contains the personal, admin, users, help and logout entry +collaboration + * optional + * can contain plugins for collaboration search (e.g. supplying share dialog) +collaboration/plugins + * optional + * must contain at least one plugin +collaboration/plugins/plugin + * required + * the PHP class name of the plugin + * must contain **type** attribute (currently only *collaboration-search*). The class must implement OCP\Collaboration\Collaborators\ISearchPlugin. + * must contain **share-type** attribute, according to the specific \OCP\Share constants -database -======== -Each supported database has to be listed in here. Valid values are sqlite, mysql, pgsql, oci and mssql. In the future -it will be possible to specify versions here as well. -In case no database is specified it is assumed that all databases are supported. +The following character maximum lengths are enforced: -command -======= -Defines a command line tool to be available. With the attribute 'os' the required operating system for this tool can be -specified. Valid values for the 'os' attribute are as returned by the PHP function `php_uname `_. +* All description Strings are database text fields and therefore not limited in size +* All other Strings have a maximum of 256 characters -lib -=== -Defines a required PHP extension with required minimum and/or maximum version. The names for the libraries have to match the result as returned by the PHP function `get_loaded_extensions `_. -The explicit version of an extension is read from `phpversion `_ - with some exception as to be read up in the `code base `_. +The following elements are either deprecated or for internal use only and will fail the validation if present: -os -== -Defines the required target operating system the app can run on. Valid values are as returned by the PHP function `php_uname `_. - -owncloud -======== -**Required**: Defines minimum and maximum versions of the Nextcloud core. In case undefined the values will be taken from the tag `requiremin`_. - -.. note:: Currently this tag is also used to check for the Nextcloud version number. - Thereby the following "translation" is made: - - * ownCloud 9.0 matches Nextcloud 9 - * ownCloud 9.1 matches Nextcloud 10 - * ownCloud 9.2 matches Nextcloud 11 - -settings --------- - -When your app has admin settings, this is the place to register the corresponding classes. - -admin-section -============= - -In case the app needs to register a new section on the admin settings page, it needs to implement the \OCP\Settings\ISection interface. The implementing class needs to be specified here. - -admin -===== - -In case the app has its own admin related settings, it needs to implement the \OCP\Settings\ISettings interface. The implementing class needs to be specified here. - - -Deprecated ----------- - -The following sections are just listed for reference and should not be used; they are deprecated and often not evaluated anymore (i.e., they are ignored). - -requiremin -========== -Deprecated in favor of the **** tag. - -public -====== -Used to provide a public interface (requires no login) for the app. The id is appended to the URL **/index.php/public**. Example with id set to 'calendar':: - - /index.php/public/calendar - -Also take a look at :doc:`../core/externalapi`. - -remote -====== -Same as public but requires login. The id is appended to the URL **/index.php/remote**. Example with id set to 'calendar':: - - /index.php/remote/calendar - -Also take a look at :doc:`../core/externalapi`. - - -standalone -========== -Can be set to true to indicate that this app is a webapp. This can be used to tell GNOME Web for instance to treat this like a native application. - -default_enable -============== -**Core apps only**: Used to tell Nextcloud to enable them after the installation. - -shipped -======= -**Core apps only**: Used to tell Nextcloud that the app is in the standard release. - -Please note that if this attribute is set to *FALSE* or not set at all, every time you disable the application, all the files of the application itself will be *REMOVED* from the server! +* **standalone** +* **default_enable** +* **shipped** +* **public** +* **remote** +* **requiremin** +* **requiremax** From 269cc812b456c6ecc2f9d9368119226a903dfef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 3 Oct 2017 21:05:48 +0200 Subject: [PATCH 05/55] App development: Update routes documentation and remove code not using DI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- developer_manual/app/container.rst | 2 + developer_manual/app/routes.rst | 122 ++++++----------------------- 2 files changed, 26 insertions(+), 98 deletions(-) diff --git a/developer_manual/app/container.rst b/developer_manual/app/container.rst index 0fff10956..3eea09f89 100644 --- a/developer_manual/app/container.rst +++ b/developer_manual/app/container.rst @@ -11,6 +11,8 @@ If you are unfamiliar with this pattern, watch the following videos: * `Dependency Injection and the art of Services and Containers Tutorial `_ * `Google Clean Code Talks `_ +.. _dependency-injection: + Dependency Injection ==================== Dependency Injection sounds pretty complicated but it just means: Don't put new dependencies in your constructor or methods but pass them in. So this: diff --git a/developer_manual/app/routes.rst b/developer_manual/app/routes.rst index 28f03f2dc..c3aed51a3 100644 --- a/developer_manual/app/routes.rst +++ b/developer_manual/app/routes.rst @@ -4,55 +4,22 @@ Routing .. sectionauthor:: Bernhard Posselt -Routes map a URL and a method to a controller method. Routes are defined inside :file:`appinfo/routes.php` by passing a configuration array to the registerRoutes method. An example route would look like this: +Routes map a URL and a method to a controller method. Routes are defined inside :file:`appinfo/routes.php` by returning them as an array: .. code-block:: php registerRoutes($this, array( - 'routes' => array( - array('name' => 'page#index', 'url' => '/', 'verb' => 'GET'), - ) - )); + return [ + 'routes' => [ + ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'], + ], + ]; The route array contains the following parts: * **url**: The URL that is matched after */index.php/apps/myapp* -* **name**: The controller and the method to call; *page#index* is being mapped to *PageController->index()*, *articles_api#drop_latest* would be mapped to *ArticlesApiController->dropLatest()*. The controller that matches the page#index name would have to be registered in the following way inside :file:`appinfo/application.php`: - - .. code-block:: php - - getContainer(); - - /** - * Controllers - */ - $container->registerService('PageController', function($c) { - return new PageController( - $c->query('AppName'), - $c->query('Request') - ); - }); - } - - } +* **name**: The controller and the method to call; *page#index* is being mapped to *PageController->index()*, *articles_api#drop_latest* would be mapped to *ArticlesApiController->dropLatest()*. The controller in the example above would be stored in :file:`lib/Controller/PageController.php`. * **method** (Optional, defaults to GET): The HTTP method that should be matched, (e.g. GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH) * **requirements** (Optional): lets you match and extract URLs that have slashes in them (see :ref:`matching-suburls`) * **postfix** (Optional): lets you define a route id postfix. Since each route name will be transformed to a route id (**page#method** -> **myapp.page.method**) and the route id can only exist once you can use the postfix option to alter the route id creation by adding a string to the route id, e.g., **'name' => 'page#method', 'postfix' => 'test'** will yield the route id **myapp.page.methodtest**. This makes it possible to add more than one route/URL for a controller method @@ -150,75 +117,34 @@ To prevent repetition, it's possible to define resources. The following routes: .. code-block:: php registerRoutes($this, array( - 'routes' => array( - array('name' => 'author#index', 'url' => '/authors', 'verb' => 'GET'), - array('name' => 'author#show', 'url' => '/authors/{id}', 'verb' => 'GET'), - array('name' => 'author#create', 'url' => '/authors', 'verb' => 'POST'), - array('name' => 'author#update', 'url' => '/authors/{id}', 'verb' => 'PUT'), - array('name' => 'author#destroy', 'url' => '/authors/{id}', 'verb' => 'DELETE'), + return [ + 'routes' => [ + ['name' => 'author#index', 'url' => '/authors', 'verb' => 'GET'], + ['name' => 'author#show', 'url' => '/authors/{id}', 'verb' => 'GET'], + ['name' => 'author#create', 'url' => '/authors', 'verb' => 'POST'], + ['name' => 'author#update', 'url' => '/authors/{id}', 'verb' => 'PUT'], + ['name' => 'author#destroy', 'url' => '/authors/{id}', 'verb' => 'DELETE'], // your other routes here - ) - )); + ], + ]; can be abbreviated by using the **resources** key: .. code-block:: php registerRoutes($this, array( - 'resources' => array( - 'author' => array('url' => '/authors') - ), - 'routes' => array( + return [ + 'resources' => [ + 'author' => [url' => '/authors'], + ], + 'routes' => [ // your other routes here - ) - )); + ], + ]; Using the URLGenerator ======================== -Sometimes it is useful to turn a route into a URL to make the code independent from the URL design or to generate a URL for an image in **img/**. For that specific use case, the ServerContainer provides a service that can be used in your container: - -.. code-block:: php - - getContainer(); - - /** - * Controllers - */ - $container->registerService('PageController', function($c) { - return new PageController( - $c->query('AppName'), - $c->query('Request'), - - // inject the URLGenerator into the page controller - $c->query('ServerContainer')->getURLGenerator() - ); - }); - } - - } - -Inside the PageController the URL generator can now be used to generate a URL for a redirect: +Sometimes it is useful to turn a route into a URL to make the code independent from the URL design or to generate a URL for an image in **img/**. Inside the PageController the URL generator can be injected by adding it to the constructor, which will allow to use it to generate a URL for a redirect. For more details on that see the :ref:`dependency-injection` reference. .. code-block:: php From 2fe21d32d2ba35ad5115e45939c4f906b774627a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Thu, 5 Oct 2017 11:16:21 +0200 Subject: [PATCH 06/55] Popovermenu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- developer_manual/design/index.rst | 1 + developer_manual/design/popovermenu.rst | 66 +++++++++++++++++++ developer_manual/images/popover-position.png | Bin 0 -> 3529 bytes developer_manual/images/popovermenu.png | Bin 0 -> 19330 bytes 4 files changed, 67 insertions(+) create mode 100644 developer_manual/design/popovermenu.rst create mode 100644 developer_manual/images/popover-position.png create mode 100644 developer_manual/images/popovermenu.png diff --git a/developer_manual/design/index.rst b/developer_manual/design/index.rst index 800af24fa..dc48991e7 100644 --- a/developer_manual/design/index.rst +++ b/developer_manual/design/index.rst @@ -6,3 +6,4 @@ Design Guidelines :maxdepth: 2 navigation + popovermenu diff --git a/developer_manual/design/popovermenu.rst b/developer_manual/design/popovermenu.rst new file mode 100644 index 000000000..da886e5a7 --- /dev/null +++ b/developer_manual/design/popovermenu.rst @@ -0,0 +1,66 @@ +.. sectionauthor:: John Molakvoæ +.. codeauthor:: John Molakvoæ + +=============== +Popover Menu +=============== + +What is a popover menu +======================= + +This is a quick menu that open on click. We're usually using the three dots icons on nextcloud. +This menu currently differs from the navigation menu on the app-navigation section on the left. We should definitely merge those two and make one single way to create a popover menu on nextcloud (see app-navigation-entry-menu class on css files) + +.. image:: ../images/popovermenu.png + +Basic layout +============= + +.. code-block:: html + +
    +
    + +Technical details +================== + +* The only allowed menu items elements are **a** and **button**. +* You can mix between a and button on the same menu (in case of form or direct link) like the example above +* You need to put the entire menu just after the three dot icon ``
    ...
    `` +* You do not need js, css only is ok for positioning. Js is **still** required to handle the hide/show. +* Only **one** ul is allowed. +* Only **one level** of menu is allowed. +* Every entry **needs** to have its own icon. This greatly improves the UX. +* The required **right** distance to the border (or padding, whatever you want to use) of the three-dot icon should be 14px (5 for menu margin and 6 for arrow position) + +.. image:: ../images/popover-position.png + +Alignment +========== +If you want to align your menu, you can add the class to the main popovermenu div. + +* Center: ``menu-center`` +* Left: ``menu-left`` +* Right is by default diff --git a/developer_manual/images/popover-position.png b/developer_manual/images/popover-position.png new file mode 100644 index 0000000000000000000000000000000000000000..2002ccaea2e8f03a9e38e32bace431d8145cefa0 GIT binary patch literal 3529 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 z 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 literal 0 HcmV?d00001 From fbb950d62cadfc64666d03bb9fe7d4a143629f3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Thu, 5 Oct 2017 17:18:52 +0200 Subject: [PATCH 07/55] Update encryption_configuration.rst Documantation is wrong, key storage needs to be located in the data folder, either physically or as a mount --- .../encryption_configuration.rst | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/admin_manual/configuration_files/encryption_configuration.rst b/admin_manual/configuration_files/encryption_configuration.rst index aeeeffe60..e65d1e8cb 100644 --- a/admin_manual/configuration_files/encryption_configuration.rst +++ b/admin_manual/configuration_files/encryption_configuration.rst @@ -242,18 +242,20 @@ View current location of keys:: occ encryption:show-key-storage-root Current key storage root: default storage location (data/) -Move keys to a different root folder, either locally or on a different server. +Move keys to a different folder, either locally or on a different server. The folder must already exist, be owned by root and your HTTP group, and be -restricted to root and your HTTP group. This example is for Ubuntu Linux. Note -that the new folder is relative to your ``occ`` directory:: +restricted to root and your HTTP group. Further the folder needs to be located +somewhere in your Nextcloud data folder, either physically, or as a mount. +This example is for Ubuntu Linux. Note that the new folder is relative to your ``occ`` directory:: - mkdir /etc/keys - chown -R root:www-data /etc/keys - chmod -R 0770 /etc/keys - occ encryption:change-key-storage-root ../../../etc/keys + cd /your/nextcloud/data + mkdir keys + chown -R root:www-data keys + chmod -R 0770 keys + occ encryption:change-key-storage-root keys Start to move keys: 4 [============================] - Key storage root successfully changed to ../../../etc/keys + Key storage root successfully changed to keys Create a new master key. Use this when you have a single-sign on infrastructure. Use this only on fresh installations with no existing data, or From 013910044ad989faeaaf5a696abda29e040fb050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Thu, 5 Oct 2017 17:40:50 +0200 Subject: [PATCH 08/55] More pages and some pictures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- developer_manual/design/checkboxes.rst | 7 ++ developer_manual/design/content.rst | 7 ++ developer_manual/design/index.rst | 4 + developer_manual/design/navigation.rst | 90 ++++++++++++------ developer_manual/design/popovermenu.rst | 52 +++++----- developer_manual/design/progress.rst | 7 ++ developer_manual/design/settings.rst | 7 ++ .../images/navigation-counter.png | Bin 0 -> 1455 bytes developer_manual/images/navigation-menu.png | Bin 0 -> 7158 bytes developer_manual/images/navigation.png | Bin 0 -> 9393 bytes 10 files changed, 120 insertions(+), 54 deletions(-) create mode 100644 developer_manual/design/checkboxes.rst create mode 100644 developer_manual/design/content.rst create mode 100644 developer_manual/design/progress.rst create mode 100644 developer_manual/design/settings.rst create mode 100644 developer_manual/images/navigation-counter.png create mode 100644 developer_manual/images/navigation-menu.png create mode 100644 developer_manual/images/navigation.png diff --git a/developer_manual/design/checkboxes.rst b/developer_manual/design/checkboxes.rst new file mode 100644 index 000000000..50f6d91b7 --- /dev/null +++ b/developer_manual/design/checkboxes.rst @@ -0,0 +1,7 @@ +.. sectionauthor:: John Molakvoæ +.. codeauthor:: John Molakvoæ +.. _checkboxes: + +=============== +Checkboxes +=============== diff --git a/developer_manual/design/content.rst b/developer_manual/design/content.rst new file mode 100644 index 000000000..7b9cfadd0 --- /dev/null +++ b/developer_manual/design/content.rst @@ -0,0 +1,7 @@ +.. sectionauthor:: John Molakvoæ +.. codeauthor:: John Molakvoæ +.. _content: + +=============== +Main content +=============== diff --git a/developer_manual/design/index.rst b/developer_manual/design/index.rst index dc48991e7..37f0d7ec1 100644 --- a/developer_manual/design/index.rst +++ b/developer_manual/design/index.rst @@ -6,4 +6,8 @@ Design Guidelines :maxdepth: 2 navigation + settings + content popovermenu + progress + checkboxes diff --git a/developer_manual/design/navigation.rst b/developer_manual/design/navigation.rst index d632ba0c3..63de59cae 100644 --- a/developer_manual/design/navigation.rst +++ b/developer_manual/design/navigation.rst @@ -1,5 +1,6 @@ .. sectionauthor:: John Molakvoæ .. codeauthor:: John Molakvoæ +.. _navigation: =============== App Navigation @@ -19,6 +20,9 @@ It needs to be: Nextcloud provide a very organized way of building menus. We implemented various essential functions and provide easy way of using them. +.. figure:: ../images/navigation.png + :alt: Navigation screenshot + Basic layout ============= @@ -44,51 +48,58 @@ Each entry is allowed to have a counter and/or a button for user interraction. * The ``app-navigation-entry-utils`` snippet need to be placed right next to the main link of your entry. * Maximum **two** items are allowed into the utils section. You can have: - * Two buttons - * One button and one counter + * Two buttons + * One button and one counter * You **can't** have more than two buttons, if you need more, you need to add a menu. * The order of the button and the counter are **not** interchangeable. You need to put the counter before the menu. .. code-block:: html
    -
      -
    • 1
    • -
    • - -
    • -
    +
      +
    • 1
    • +
    • + +
    • +
    +.. _navigation_menu: + Menu ^^^^^ -If you need to add a few interractions for your entry, you can but everything in a popover menu. +If you need to add a few interractions for your entry, you can put everything in a popover menu. The menu needs to be placed after the ``app-navigation-entry-utils``. +For the global rules and/or layout, you can check the dedicated :ref:`popover menu section `. + +.. figure:: ../images/navigation-menu.png + :alt: Navigation menu + .. code-block:: html
    - +
    Counter @@ -97,12 +108,33 @@ Counter If you need to add a counter to your menu entry, you can simply use this structure. Do not change the alignment of the text. If you're using +.. figure:: ../images/navigation-counter.png + :alt: Navigation entry with counter + .. code-block:: html
  • 1
  • +Drag and drop +============== +The class which should be applied to a first level element **li** that hosts or can host a second level is **drag-and-drop**. +This will cause the hovered entry to slide down giving a visual hint that it can accept the dragged element. +In case of jQuery UI's droppable feature, the **hoverClass** option should be set to the **drag-and-drop** class. +.. code-block:: html + Collapsible entry ================== diff --git a/developer_manual/design/popovermenu.rst b/developer_manual/design/popovermenu.rst index da886e5a7..bf1bd22e9 100644 --- a/developer_manual/design/popovermenu.rst +++ b/developer_manual/design/popovermenu.rst @@ -1,5 +1,6 @@ .. sectionauthor:: John Molakvoæ .. codeauthor:: John Molakvoæ +.. _popovermenu: =============== Popover Menu @@ -9,7 +10,8 @@ What is a popover menu ======================= This is a quick menu that open on click. We're usually using the three dots icons on nextcloud. -This menu currently differs from the navigation menu on the app-navigation section on the left. We should definitely merge those two and make one single way to create a popover menu on nextcloud (see app-navigation-entry-menu class on css files) + +This is exactly the same as the :ref:`navigation menu `. The only difference is the popovermenu class. .. image:: ../images/popovermenu.png @@ -18,30 +20,30 @@ Basic layout .. code-block:: html -
    -
    +
    +
    Technical details ================== diff --git a/developer_manual/design/progress.rst b/developer_manual/design/progress.rst new file mode 100644 index 000000000..1d72e6b02 --- /dev/null +++ b/developer_manual/design/progress.rst @@ -0,0 +1,7 @@ +.. sectionauthor:: John Molakvoæ +.. codeauthor:: John Molakvoæ +.. _progress: + +=============== +Progress bar +=============== diff --git a/developer_manual/design/settings.rst b/developer_manual/design/settings.rst new file mode 100644 index 000000000..6449f315e --- /dev/null +++ b/developer_manual/design/settings.rst @@ -0,0 +1,7 @@ +.. sectionauthor:: John Molakvoæ +.. codeauthor:: John Molakvoæ +.. _settings: + +=============== +Settings +=============== diff --git a/developer_manual/images/navigation-counter.png b/developer_manual/images/navigation-counter.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9ffc86636b5b9ea1576b55da0c43a4eda46ad7 GIT binary patch literal 1455 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 literal 0 HcmV?d00001 diff --git a/developer_manual/images/navigation.png b/developer_manual/images/navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..16704168fc3464fa4dcd206e2338ce648605fa9d GIT binary patch literal 9393 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 MBo!qJkcQ9x2VmLPSpWb4 literal 0 HcmV?d00001 From adabb111442b3ee52ccbf48664a24b1a15c61ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Fri, 6 Oct 2017 05:18:55 +0200 Subject: [PATCH 09/55] Grammar fixes and syntax MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- developer_manual/design/navigation.rst | 12 ++++++------ developer_manual/design/popovermenu.rst | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/developer_manual/design/navigation.rst b/developer_manual/design/navigation.rst index 63de59cae..5b048365b 100644 --- a/developer_manual/design/navigation.rst +++ b/developer_manual/design/navigation.rst @@ -9,7 +9,7 @@ App Navigation Introduction ============= -The main navigation menu represent the most important part of your app. +The main navigation menu represents the main navigation of your app. It needs to be: @@ -17,7 +17,7 @@ It needs to be: * Simple * Responsive -Nextcloud provide a very organized way of building menus. +Nextcloud provides a very organized way of building menus. We implemented various essential functions and provide easy way of using them. .. figure:: ../images/navigation.png @@ -44,12 +44,12 @@ Basic layout Utils ====== -Each entry is allowed to have a counter and/or a button for user interraction. +Each entry is allowed to have a counter and/or a button for user interaction. * The ``app-navigation-entry-utils`` snippet need to be placed right next to the main link of your entry. * Maximum **two** items are allowed into the utils section. You can have: - * Two buttons - * One button and one counter + * Two buttons + * One button and one counter * You **can't** have more than two buttons, if you need more, you need to add a menu. * The order of the button and the counter are **not** interchangeable. You need to put the counter before the menu. @@ -69,7 +69,7 @@ Each entry is allowed to have a counter and/or a button for user interraction. Menu ^^^^^ -If you need to add a few interractions for your entry, you can put everything in a popover menu. +If you need to add a few interactions for your entry, you can put everything in a popover menu. The menu needs to be placed after the ``app-navigation-entry-utils``. For the global rules and/or layout, you can check the dedicated :ref:`popover menu section `. diff --git a/developer_manual/design/popovermenu.rst b/developer_manual/design/popovermenu.rst index bf1bd22e9..5e9a30759 100644 --- a/developer_manual/design/popovermenu.rst +++ b/developer_manual/design/popovermenu.rst @@ -9,7 +9,7 @@ Popover Menu What is a popover menu ======================= -This is a quick menu that open on click. We're usually using the three dots icons on nextcloud. +This is a quick menu that open on click. For menus, we use the three-dot-icon. This is exactly the same as the :ref:`navigation menu `. The only difference is the popovermenu class. @@ -51,7 +51,7 @@ Technical details * The only allowed menu items elements are **a** and **button**. * You can mix between a and button on the same menu (in case of form or direct link) like the example above * You need to put the entire menu just after the three dot icon ``
    ...
    `` -* You do not need js, css only is ok for positioning. Js is **still** required to handle the hide/show. +* You do not need JS, CSS only is ok for positioning. JS is **still** required to handle the hide/show. * Only **one** ul is allowed. * Only **one level** of menu is allowed. * Every entry **needs** to have its own icon. This greatly improves the UX. From b3fcb907d08b0c7731a5f0bf4aff9ae513f06f07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Sat, 7 Oct 2017 05:50:38 +0200 Subject: [PATCH 10/55] Navigation edit, syntax illustrations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- developer_manual/design/navigation.rst | 49 +++++++++++++++--- developer_manual/design/popovermenu.rst | 2 +- .../images/navigation-buttons.png | Bin 0 -> 1585 bytes 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 developer_manual/images/navigation-buttons.png diff --git a/developer_manual/design/navigation.rst b/developer_manual/design/navigation.rst index 5b048365b..cb6d8047f 100644 --- a/developer_manual/design/navigation.rst +++ b/developer_manual/design/navigation.rst @@ -22,11 +22,12 @@ We implemented various essential functions and provide easy way of using them. .. figure:: ../images/navigation.png :alt: Navigation screenshot + :align: right Basic layout ============= -.. code-block:: html +.. code:: html