GithubHelp home page GithubHelp logo

cozy / cozy-drive Goto Github PK

View Code? Open in Web Editor NEW
169.0 20.0 63.0 532.51 MB

Cozy Drive Web App for Cozy Cloud

License: GNU Affero General Public License v3.0

JavaScript 93.04% Smarty 0.01% Stylus 2.49% EJS 0.42% TypeScript 4.04%
cozy file-manager drive

cozy-drive's Introduction

Travis build status shield Github Release version shield NPM Licence shield

Cozy Drive

What's Cozy?

Cozy Logo

Cozy is a platform that brings all your web services in the same private space. With it, your webapps and your devices can share data easily, providing you with a new experience. You can install Cozy on your own hardware where no one's tracking you.

What's Drive?

Cozy Drive makes your file management easy. Main features are:

  • File tree
  • Files and folders upload.
  • Files and folders sharing (via URLs)
  • Files and folders search

Getting Started

📌 Note: Yarn is the official Node package manager of Cozy. Don't hesitate to install Yarn and use it in any Cozy projects.

Install

Starting the Drive app requires you to setup a dev environment.

You can then clone the app repository and install dependencies:

$ git clone https://github.com/cozy/cozy-drive.git
$ cd cozy-drive
$ yarn install

📌 Don't forget to set the local node version indicated in the .nvmrc before doing a yarn install.

⚠️ During its early ages, cozy-drive uses beta versions of cozy-ui and [cozy-client-js], take a look at the "living on the edge" note below to know how to install and configure the latest available versions.

Cozy's apps use a standard set of npm scripts to run common tasks, like watch, lint, test, build…

Run in dev mode

Using a watcher - with Hot Module Replacement:

$ cd cozy-drive
$ yarn watch
$ cozy-stack serve --appdir drive:/<project_absolute_path>/cozy-drive/build/drive --disable-csp

Or directly build the app (static file generated):

$ cd cozy-drive
$ yarn build
$ cozy-stack serve --appdir drive:/<project_absolute_path>/cozy-drive/build/drive

Your app is available at http://drive.cozy.localhost:8080/#/folder

Note: it's mandatory to explicit to cozy-stack the folder of the build that should be served, to be able to run the app.

Run it inside the VM

You can easily view your current running app, you can use the cozy-stack docker image:

# in a terminal, run your app in watch mode
$ cd cozy-drive
$ yarn watch
# in another terminal, run the docker container
$ docker run --rm -it -p 8080:8080 -v "$(pwd)/build/drive":/data/cozy-app/drive cozy/cozy-app-dev

Your app is available at http://drive.cozy.tools:8080.

Advanced case

Share and send mails in development

Cozy apps let users share documents from cozy to cozy.

Meet Alice and Bob. Alice wants to share a folder with Bob. Alice clicks on the share button and fills in the email input with Bob's email address. Bob receives an email with a « Accept the sharing » button. Bob clicks on that button and is redirected to Alice's cozy to enter his own cozy url to link both cozys. Bob sees Alice's shared folder in his own cozy.

🤔 But how could we do this scenario on binary cozy-stack development environment?

If you develop with the cozy-stack CLI, you have to run MailHog on your computer and tell cozy-stack serve where to find the mail server with some options:

./cozy-stack serve --appdir drive:../cozy-drive/build,settings:../cozy-settings/build --mail-disable-tls --mail-port 1025

This commands assumes you git clone cozy-drive and cozy-settings in the same folder than you git clone cozy-stack.

Then simply run mailhog and open http://cozy.tools:8025/.

Retrieve sent emails

With MailHog, every email sent by cozy-stack is caught. That means the email address does not have to be a real one, ie. bob@cozy, [email protected] are perfectly fine. It could be a real one, but the email will not reach the real recipient's inbox, say [email protected].

Living on the edge

Cozy-ui is our frontend stack library that provides common styles and components accross the whole Cozy's apps. You can use it for you own application to follow the official Cozy's guidelines and styles. If you need to develop / hack cozy-ui, it's sometimes more useful to develop on it through another app. You can do it by cloning cozy-ui locally and link it to yarn local index:

git clone https://github.com/cozy/cozy-ui.git
cd cozy-ui
yarn install
yarn link

then go back to your app project and replace the distributed cozy-ui module with the linked one:

cd cozy-drive
yarn link cozy-ui

You can now run the watch task and your project will hot-reload each times a cozy-ui source file is touched.

Troubleshooting

Consider using rlink instead of yarn link

Cozy-client is our API library that provides an unified API on top of the cozy-stack. If you need to develop / hack cozy-client in parallel of your application, you can use the same trick that we used with cozy-ui: yarn linking.

Tests

Tests are run by jest under the hood, and written using chai and sinon. You can easily run the tests suite with:

$ cd cozy-drive
$ yarn test

📌 Don't forget to update / create new tests when you contribute to code to keep the app the consistent.

Open a Pull-Request

If you want to work on Drive and submit code modifications, feel free to open pull-requests! See the contributing guide for more information about how to properly open pull-requests.

Community

Localization

Localization and translations are handled by Transifex.

As a translator, you can login to Transifex (using your Github account) and claim access to the app repository. Locales are pulled by the pipeline when app is build before publishing.

As a developer, you must configure the Transifex CLI, and claim access as maintainer to the app repository. Then please only update the source locale file (usually en.json in client and/or server parts), and push it to Transifex repository using the tx push -s command.

If you were using a transifex-client, you must move to Transifex CLI to be compatible with the v3 API.

The transifex configuration file is still in an old version. Please use the previous client for the moment https://github.com/transifex/transifex-client/.

Drive specificity

CozyDrive and CozyPhotos share this mono-repository but the translations are split into two projects Transifex. That is why the translation files are not present in this repository.

To update the translation in other language, make the changes directly on tx-translate. Select one language and click on global

Maintainer

The lead maintainer for Cozy Drive is @Crash--, send him/her a 🍻 to say hello!

Get in touch

You can reach the Cozy Community by:

License

Cozy Drive is developed by Cozy Cloud and distributed under the AGPL v3 license.

cozy-drive's People

Contributors

acezard avatar cballevre avatar cedricmessiant avatar cozykourai avatar cpatchane avatar crash-- avatar dependabot[bot] avatar enguerran avatar goldoraf avatar gooz avatar gregorylegarec avatar jf-cozy avatar jsilvestre avatar kosssi avatar ldoppea avatar m4dz avatar merkur39 avatar narkfr avatar nono avatar paultranvan avatar pierrevdk avatar poupotte avatar probot-auto-merge[bot] avatar ptbrowne avatar renovate-bot avatar renovate[bot] avatar trollepierre avatar y-lohse avatar ysa000 avatar zatteo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cozy-drive's Issues

Cannot delete directory

You should have received my logs but I create a ticket here to track the issue.
Sometimes (not everytime) I cannot delete a directory from the app. The popup is closed but the grey overlay remains and I cannot click anywhere (the back button still works though):

screenshot_20180823-001048

Here I tried to remove the "Administrative" directory.

Cozy drive error on install on Linux Mint 17.1 Rebecca: GLIBCXX_3.4.21' not found

Hello. I just installed Cozy Drive on my computer and get this error:

Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /tmp/.org.chromium.Chromium.5xq5aV): unable to import leveldown

Cozy drive has gone through the set up, installed apparently well, but does not seem to want to sync with my computer (I threw one image in there and it didn't sync.).

Having a created at column?

I just synchronized all the stuff stored on my phone... (Well I've not finished yet...)

On Cozy Cloud, I've an "updated" ("Mise à jour") column. This column is filled with the current date of synchronization (yesterday or today).

Is there a way to have the real created date? Because having 3 or 4 years files and can't sort them by date it's something problematic.

[cozy-client] Relations/associations between doctypes

Comment standardiser la récupération automatique des liens entre doctypes ?

Par exemple du coté de cozy bank nous avons différents liens entre les opérations les factures ainsi que les fichiers.

Nous avons une many-to-many entre les opérations et les factures : operation.bills <-> bill.creditOperations

Comment cozy-client va pouvoir récupérer automatiquement ses liaisons ?

Cannot scroll in settings screen

While it's not really apparent on the screenshot, I cannot scroll to the bottom of the screen. I don't know if I am missing some options (in landscape I would) but the text is truncated at least:

screenshot_20180823-024742

My phone: a Nexus 5X, with Android 8.1

[cozy-authentication] Use npm module instead of directly importing it

Behavior

Since the code from cozy-authentication is in the same repository as cozy-drive, cozy-drive can directly import the code instead of using the npm module. Since drive is not using the library "normally", bugs can happen for users of the library without drive noticing.

Expectation

Drive should use cozy-authentication as an npm module in order not to overlook potential bugs.

More information

We experienced a hard to debug bug when compiling Banks for mobile. UglifyJS was failing on a "Unexpected token punc ()". The culprit was a problem of transpilation in cozy-authentication : babel-loader does not correctly transpile code from a file outside the directory where the .babelrc is. This meant that arrow functions from src/drive/mobile/lib/device.js (imported as '../../drive/mobile/lib/device') were not transpiled and were shipped on npm as-is.

This lead to the problem in cozy-banks since Uglify-js does not support arrow functions.

This has been "solved" (badly here, and correctly here) by copying the two arrow functions into cozy-authentication but it remains an issue that drive is not using the lib as other use it, and thus can overlook bugs.

Plan : Test + Publication de redux-cozy-client sur npm

Test

Pour les tests, je vous propose que Travis lance les tests seulement si un fichier contenu dans src/lib/redux-cozy-client` a été modifié.

Publication

Nous allons devoir publier la librairie sur npm (en mode automatique j'espère), je me dis autant mettre ça en place dès maintenant même si la librairie n'est pas encore stable. Nous utiliserons la nomentlature semver.

Prérequis : Il va falloir que l'on ajoute un fichier package.json dans le dossier de la lib.

Je vois plusieurs solutions :

  1. On publie à la main ...

  2. A chaque modification Travis publie une nouvelle version automatiquement sur npm. Comment on gère les numéros de version ? ... beta-42 ?

  3. A chaque modification du numéro de version Travis publie sur npm (il faut qu'il vérifie sur npm quelle version il y a actuellement et si la version n'existe pas il publie)

  4. Travis push automatiquement le code sur un autre repo (cozy/redux-cozy-client). Ce qui permet d'avoir la documentation, les issues sur un autre repo que cozy-drive. Depuis ce nouveau repo on a juste a créer une release à la main pour que celui-ci publie sur npm (ou on met en place la release automatique quand le numéro de version change). Ca peut permettre de minimiser le temps d'execution coté Travis.

Vous en pensez quoi ?

Tâche

En plus quand on a le temps

  • Tester la librairie seulement si une modification est faite
  • Publier sur npm automatiquement après changement du numéro de version
  • Ajouter un CHANGELOG.md
  • Compiler la librairie

Remove the cozy-bar from the services

Following up on #717 , we don't really need the cozy bar in the embeder, but somehow it ends up importing components that use BarLeft etc. Probably the Breadcrumbs but maybe something else too.
We should investigate of we can somehow break these dependencies.

[cozy-client] Choose the adapter used in fetchCollection

We have a performance card (https://trello.com/c/mBQdYuzZ/418-3-fetcher-les-donn%C3%A9es-via-un-fetchcollection-cozy-client-et-activer-la-synchronisation-en-parall%C3%A8le) to fix the long syncing time at the app startup. We want to display informations before the sync is finished.

We thought of issuing a fetchCollection and tell it to use the stack adapter for the first call : fetchCollection('transactions', 'io.cozy.bank.transactions', { adapter: 'stack' })

Does it seem OK to you to add this parameter ? I can do the PR :)

Must specify `fields` in `fetchCollection` if `selector` is used

Related code :

if (options.selector) {
const index = await this.getCollectionIndex(name, doctype, options)
return this.getAdapter(doctype).queryDocuments(doctype, index, {
...options,
skip
})
}

If you use selector, you must also provide the fields option otherwise it fails in the queryDocument part when it tries to destructure the fields .

fields: [...fields, '_id', '_type', 'class'],

[cozy-client] Updates only the first FETCH_LIMIT documents

Problem

When deleting a large number of documents (> 50), only the first 50 documents are deleted.

Expected

All documents matching the query should be deleted.

Explanation

Since deleteDocuments uses queryDocuments under the hood and queryDocuments is limiting the fetch by FETCH_LIMIT, only the first FETCH_LIMIT documents are updated (deleted in this case). A possible solution would be for queryDocuments to support { limit: null } in its options and then it would fetch all the documents. Then updateDocuments could add { limit: null } to queryDocuments options .

queryDocuments

async queryDocuments(doctype, index, options) {
const fields = options.fields
const skip = options.skip || 0
// Mango wants an array of single-property-objects...
const sort = options.sort
? index.fields.map(f => ({ [f]: options.sort[f] || 'desc' }))
: undefined
const queryOptions = {
limit: FETCH_LIMIT,
wholeResponse: true, // WARN: mandatory to get the full JSONAPI response
...options,
// TODO: type and class should not be necessary, it's just a temp fix for a stack bug
fields: fields ? [...fields, '_id', '_type', 'class'] : undefined,
skip,
sort
}
// abstract away the format differences between query replies on the VFS versus the data API
let data, meta, next
if (doctype === FILES_DOCTYPE) {
const response = await cozy.client.files.query(index, queryOptions)
data = response.data.map(doc =>
Object.assign({ _id: doc.id, _type: doctype }, doc, doc.attributes)
)
meta = response.meta
next = meta.count > skip + FETCH_LIMIT
} else {
const response = await cozy.client.data.query(index, queryOptions)
data = response.docs.map(doc =>
Object.assign({ id: doc._id, _type: doctype }, doc)
)
meta = {}
next = response.next
}
// we forge a correct JSONAPI response:
return { data, meta, next }
}

updateDocuments

async updateDocuments(doctype, query, iterator) {
const index = await this.createIndex(doctype, getIndexFields(query))
const docs = await this.queryDocuments(doctype, index, query)
const updatedDocs = docs.data.map(iterator).map(sanitizeDoc)
await cozy.client.fetchJSON('POST', `/data/${doctype}/_bulk_docs`, {
docs: updatedDocs
})
return { data: updatedDocs }
}

deleteDocuments

async deleteDocuments(doctype, query) {
return this.updateDocuments(doctype, query, doc => ({
...doc,
_deleted: true
}))
}

Extra

Could there be a way of not having to request all documents to delete them ? The stack should be involved in this case.

Support Desktop integration when running AppImage on GNU/Linux

Cozy-drive AppImage should provide an optional desktop integration, i.e. creating Desktop Entry file (with .desktop extension) inside of ~/.config/autostart
When auto-updating, Cozy-drive should take care of updating the Desktop Entry with the new AppImage path.

Invalid Web App Manifest

I'm using the the cloud instance at mycozy.cloud and when I try to add the web app to my home screen it doesn't open in standalone display mode as specified in the manifest.

Firefox Nightly doesn't show the ambient add to home screen badge in the URL bar and adding a page shortcut fails to find an icon. Chrome finds an icon but has to automatically generate a name and doesn't open the app in standalone display mode.

I noticed that the "name" field of the web app manifest for the photos app is blank, which may be the reason.

Select a range of photos

Hi there :)
Would be great if we had the possibility to select a range of photos in Cozy Photos directly using shift, for example to add a bunch of photo to an album, as for now I have to select each photo individually.
Is there a feature like that that I missed?

Thanks!

Release on fdroid?

I'm using LineageOS and I installed cozy-drive using the APK from the release page, it's OK. But I won't get updates this way, so it may make sense to upload your APK to fdroid, what do you think?

Some folders seem to be there but not displayed

image
image

Pourtant je ne vois pas ces dossiers quand je curl.

$ curl 'http://localhost:5984/cozy-tools-8080%2Fio-cozy-files/_all_docs?include_docs=true' | jq '.'
{
  "total_rows": 13,
  "offset": 0,
  "rows": [
    {
      "id": "372eba93e674f0b73037f05abd0021fd",
      "key": "372eba93e674f0b73037f05abd0021fd",
      "value": {
        "rev": "2-b8033e0dff8de5a97239402dc4b7c6a2"
      },
      "doc": {
        "_id": "372eba93e674f0b73037f05abd0021fd",
        "_rev": "2-b8033e0dff8de5a97239402dc4b7c6a2",
        "type": "directory",
        "name": "Administration2",
        "dir_id": "io.cozy.files.trash-dir",
        "restore_path": "/",
        "created_at": "2017-05-15T15:45:13.873420067+02:00",
        "updated_at": "2017-05-15T15:45:13.873420067+02:00",
        "tags": [],
        "path": "/.cozy_trash/Administration2"
      }
    },
    {
      "id": "597c241f7e7b925a1b1c5397020037c5",
      "key": "597c241f7e7b925a1b1c5397020037c5",
      "value": {
        "rev": "2-9cd20de819230f46577035b70e41b8c1"
      },
      "doc": {
        "_id": "597c241f7e7b925a1b1c5397020037c5",
        "_rev": "2-9cd20de819230f46577035b70e41b8c1",
        "type": "directory",
        "name": "DRIVE",
        "dir_id": "io.cozy.files.trash-dir",
        "restore_path": "/",
        "created_at": "2017-05-10T15:55:36.463368501+02:00",
        "updated_at": "2017-05-10T15:55:36.463368501+02:00",
        "tags": [],
        "path": "/.cozy_trash/DRIVE"
      }
    },
    {
      "id": "597c241f7e7b925a1b1c53970200430c",
      "key": "597c241f7e7b925a1b1c53970200430c",
      "value": {
        "rev": "2-7d4bda6fad5973b100e94935214a3071"
      },
      "doc": {
        "_id": "597c241f7e7b925a1b1c53970200430c",
        "_rev": "2-7d4bda6fad5973b100e94935214a3071",
        "type": "directory",
        "name": "HELLo",
        "dir_id": "io.cozy.files.trash-dir",
        "restore_path": "/",
        "created_at": "2017-05-10T15:56:00.449845978+02:00",
        "updated_at": "2017-05-10T15:56:00.449845978+02:00",
        "tags": [],
        "path": "/.cozy_trash/HELLo"
      }
    },
    {
      "id": "597c241f7e7b925a1b1c539702004b6c",
      "key": "597c241f7e7b925a1b1c539702004b6c",
      "value": {
        "rev": "1-58b9e095ae967da25baaaef05ddb06fc"
      },
      "doc": {
        "_id": "597c241f7e7b925a1b1c539702004b6c",
        "_rev": "1-58b9e095ae967da25baaaef05ddb06fc",
        "type": "directory",
        "name": "DATA_EDF",
        "dir_id": "io.cozy.files.root-dir",
        "created_at": "2017-05-10T15:56:22.24588473+02:00",
        "updated_at": "2017-05-10T15:56:22.24588473+02:00",
        "tags": [],
        "path": "/DATA_EDF"
      }
    },
    {
      "id": "597c241f7e7b925a1b1c53970204586b",
      "key": "597c241f7e7b925a1b1c53970204586b",
      "value": {
        "rev": "1-9d5ed60e4df290e2983a78d350b334ac"
      },
      "doc": {
        "_id": "597c241f7e7b925a1b1c53970204586b",
        "_rev": "1-9d5ed60e4df290e2983a78d350b334ac",
        "type": "file",
        "name": "201607_edf.pdf",
        "dir_id": "597c241f7e7b925a1b1c539702004b6c",
        "created_at": "2017-05-10T15:57:04.947292696+02:00",
        "updated_at": "2017-05-10T15:57:04.947292696+02:00",
        "size": "143624",
        "md5sum": "fqR6Q3XnGhnOVOC4G4j+OA==",
        "mime": "application/pdf",
        "class": "application",
        "executable": false,
        "trashed": false,
        "tags": []
      }
    },
    {
      "id": "_design/by-parent-type-name",
      "key": "_design/by-parent-type-name",
      "value": {
        "rev": "1-9ad74947b52a0c6e220c09807ea43fe6"
      },
      "doc": {
        "_id": "_design/by-parent-type-name",
        "_rev": "1-9ad74947b52a0c6e220c09807ea43fe6",
        "language": "javascript",
        "views": {
          "by-parent-type-name": {
            "map": "\nfunction(doc) {\n  emit([doc.dir_id, doc.type, doc.name])\n}",
            "reduce": "_count"
          }
        }
      }
    },
    {
      "id": "_design/dir-by-path",
      "key": "_design/dir-by-path",
      "value": {
        "rev": "1-03e566302a0571a761cf5e079fbbc6b7"
      },
      "doc": {
        "_id": "_design/dir-by-path",
        "_rev": "1-03e566302a0571a761cf5e079fbbc6b7",
        "language": "query",
        "views": {
          "9f7f20fecdc49475e268724062779a3944d3bad1": {
            "map": {
              "fields": {
                "path": "asc"
              }
            },
            "reduce": "_count",
            "options": {
              "def": {
                "fields": [
                  "path"
                ]
              }
            }
          }
        }
      }
    },
    {
      "id": "_design/dir-children",
      "key": "_design/dir-children",
      "value": {
        "rev": "1-65646335b8a5d9f21a9bd71034bd99a4"
      },
      "doc": {
        "_id": "_design/dir-children",
        "_rev": "1-65646335b8a5d9f21a9bd71034bd99a4",
        "language": "query",
        "views": {
          "13bec74c6d7b28c61af2922ffe238908b8bed33e": {
            "map": {
              "fields": {
                "dir_id": "asc",
                "_id": "asc"
              }
            },
            "reduce": "_count",
            "options": {
              "def": {
                "fields": [
                  "dir_id",
                  "_id"
                ]
              }
            }
          }
        }
      }
    },
    {
      "id": "_design/disk-usage",
      "key": "_design/disk-usage",
      "value": {
        "rev": "1-b598119ae3a61c73c62c8e7571a21f07"
      },
      "doc": {
        "_id": "_design/disk-usage",
        "_rev": "1-b598119ae3a61c73c62c8e7571a21f07",
        "language": "javascript",
        "views": {
          "disk-usage": {
            "map": "\nfunction(doc) {\n  if (doc.type === 'file') {\n    emit(doc._id, +doc.size);\n  }\n}\n",
            "reduce": "_sum"
          }
        }
      }
    },
    {
      "id": "_design/e4d338e5d6f047749f5399ab998b4fa04ba0c816",
      "key": "_design/e4d338e5d6f047749f5399ab998b4fa04ba0c816",
      "value": {
        "rev": "1-93e2008096055fcf14252800fb9a9cca"
      },
      "doc": {
        "_id": "_design/e4d338e5d6f047749f5399ab998b4fa04ba0c816",
        "_rev": "1-93e2008096055fcf14252800fb9a9cca",
        "language": "query",
        "views": {
          "e4d338e5d6f047749f5399ab998b4fa04ba0c816": {
            "map": {
              "fields": {
                "_id": "asc"
              }
            },
            "reduce": "_count",
            "options": {
              "def": {
                "fields": [
                  "_id"
                ]
              }
            }
          }
        }
      }
    },
    {
      "id": "_design/referenced-by",
      "key": "_design/referenced-by",
      "value": {
        "rev": "1-35139b087f6527c64b381f66e8caa631"
      },
      "doc": {
        "_id": "_design/referenced-by",
        "_rev": "1-35139b087f6527c64b381f66e8caa631",
        "language": "javascript",
        "views": {
          "referenced-by": {
            "map": "\nfunction(doc) {\n  if (isArray(doc.referenced_by)) {\n    for (var i = 0; i < doc.referenced_by.length; i++) {\n      emit([doc.referenced_by[i].type, doc.referenced_by[i].id]);\n    }\n  }\n}"
          }
        }
      }
    },
    {
      "id": "io.cozy.files.root-dir",
      "key": "io.cozy.files.root-dir",
      "value": {
        "rev": "1-972356a16f6ebc1d218ae3ebfcec95c5"
      },
      "doc": {
        "_id": "io.cozy.files.root-dir",
        "_rev": "1-972356a16f6ebc1d218ae3ebfcec95c5",
        "type": "directory",
        "name": "",
        "dir_id": "",
        "created_at": "0001-01-01T00:00:00Z",
        "updated_at": "0001-01-01T00:00:00Z",
        "tags": null,
        "path": "/"
      }
    },
    {
      "id": "io.cozy.files.trash-dir",
      "key": "io.cozy.files.trash-dir",
      "value": {
        "rev": "1-7a480b3db00eea44da62440c4680e55c"
      },
      "doc": {
        "_id": "io.cozy.files.trash-dir",
        "_rev": "1-7a480b3db00eea44da62440c4680e55c",
        "type": "directory",
        "name": ".cozy_trash",
        "dir_id": "io.cozy.files.root-dir",
        "created_at": "0001-01-01T00:00:00Z",
        "updated_at": "0001-01-01T00:00:00Z",
        "tags": null,
        "path": "/.cozy_trash"
      }
    }
  ]
}

 

Dependency deprecation warning: node-uuid (npm)

On registry https://registry.npmjs.org/, the "latest" version (v1.4.8) of dependency node-uuid has the following deprecation notice:

Use uuid module instead

Marking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.

Affected package file(s): package.json

If you don't care about this, you can close this issue and not be warned about node-uuid's deprecation again. If you would like to completely disable all future deprecation warnings then add the following to your config:

"suppressNotifications": ["deprecationWarningIssues"]

Dependency deprecation warning: node-uuid (nvm)

On registry https://registry.npmjs.org/, the "latest" version (v1.4.8) of dependency node-uuid has the following deprecation notice:

Use uuid module instead

Marking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.

Please take the actions necessary to rename or substitute this deprecated package and commit to your base branch. If you wish to ignore this deprecation warning and continue using node-uuid as-is, please add it to your ignoreDeps array in Renovate config before closing this issue, otherwise another issue will be recreated the next time Renovate runs.

Affected package file(s): package.json

Build time of css file

I worked on a problem with stylus, webpack and their loaders.

a custom webpack.config.js

To have a clear view of what is happening, I created a custom simplified webpack config file with the following content:

const path = require('path')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const { DefinePlugin, optimize, LoaderOptionsPlugin } = require('webpack')
const PostCSSAssetsPlugin = require('postcss-assets-webpack-plugin')

/**
 * loaders:
 * - babel-loader
 * - json-loader
 * - style-loader
 * - css-loader
 * - postcss-loader
 * - stylus-loader
 *
 * plugins:
 * - extract-text-webpack-plugin
 *
 * lib:
 * - preact-compat
 * - cozy-ui
 * - autoprefixer
 */

module.exports = production => ({
  entry: path.resolve(__dirname, 'targets/drive/web/main.jsx'),
  // entry: path.resolve(__dirname, 'entry.js'),
  // entry: path.resolve(__dirname, 'src/temp.js'),
  output: {
    path: path.resolve(__dirname, 'build/drive'),
    filename: '[name].[hash].js'
  },
  resolve: {
    extensions: ['.js', '.jsx', '.styl'],
    alias: {
      react: 'preact-compat',
      'react-dom': 'preact-compat'
    },
    modules: [
      'node_modules',
      path.resolve(__dirname, 'src/lib'),
      path.resolve(__dirname, 'src')
    ]
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      },
      {
        test: /\.jsx?$/,
        include: /node_modules\/cozy-ui/,
        loader: 'babel-loader'
      },
      {
        test: /\.json$/,
        loader: 'json-loader'
      },
      {
        test: /\.styl$/,
        loader: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: [
            {
              loader: 'css-loader'
              // options: {
              //   sourceMap: false,
              //   importLoaders: 1,
              //   modules: true,
              //   localIdentName: '[local]--[hash:base64:5]'
              // }
            },
            {
              loader: 'postcss-loader',
              options: {
                sourceMap: false,
                plugins: () => [
                  require('autoprefixer')({
                    browsers: ['last 2 versions']
                  })
                ]
              }
            },
            {
              loader: 'stylus-loader',
              options: {
                // import: ['~normalize.css/normalize.css', '~cozy-ui']
              }
            }
          ]
        })
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin('[name].noduplicate.css'),
    new optimize.UglifyJsPlugin({
      mangle: true,
      compress: {
        warnings: false
      }
    }),
    new DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production'), // to compile on production mode (redux)
      __DEVELOPMENT__: false,
      __DEVTOOLS__: false,
      __STACK_ASSETS__: true,
      __PIWIK_SITEID__: 8,
      __PIWIK_SITEID_MOBILE__: 12,
      __PIWIK_DIMENSION_ID_APP__: 1,
      __PIWIK_TRACKER_URL__: JSON.stringify('https://piwik.cozycloud.cc')
    }),
    new PostCSSAssetsPlugin({
      test: /\.css$/,
      plugins: [
        //     require('css-mqpacker'),
        require('postcss-discard-duplicates')
        //     require('postcss-discard-empty')
        //   ].concat(
        //     require('csswring')({
        //       preservehacks: true,
        //       removeallcomments: true
        //     })
        //   )
      ]
    })
  ]
})

This file contains some specific line to create a css file at the end of the build:

create the css file

new ExtractTextPlugin('[name].noduplicate.css'),

remove duplicates

new PostCSSAssetsPlugin({
  require('postcss-discard-duplicates')
})

what to put in the css file (aka loaders)

{
  test: /\.styl$/,
  loader: ExtractTextPlugin.extract({
    fallback: 'style-loader',
    use: [
      {
        loader: 'css-loader'
      },
      {
        loader: 'postcss-loader',
        options: {
          sourceMap: false,
          plugins: () => [
            require('autoprefixer')({
              browsers: ['last 2 versions']
            })
          ]
        }
      },
      {
        loader: 'stylus-loader'
      }
    ]
  })
}

To explain: starting at the entry file declared in the webpack config file, each time it sees something that matches /\.styl$/ it uses stylus-loader, then postcss-loader, then css-loader

How Webpack works

Once loaders did their jobs, plugins can do their. In the case of the postcss-discard-duplicates, it removes from the built css file duplicate codes.

Observations

If I remove the postcss-discard-duplicates plugin, then, I got this result:

34 seconds to create a 1.27 MB css file.

If I remove duplicates, then:

34 secondes to create a 282 kB css file.

Notice the following line:

Start PostCSSAssetsPlugin
Processing main.noduplicate.css...
Processed main.noduplicate.css. Length before: 1265860, length after: 282325
Finish PostCSSAssetsPlugin

The big version contains a lot of duplicates:

Analyses

Assuming there is no need to use postcss-discard-duplicates unless to correct developer's air-head, I believe we could create a 300 kB file on a one-shot build. But how?

We use .styl files from cozy-ui instead of importing a unique .css file. Is that the best way?

We use @require in local .styl files to access some variables (values and @extend). With webpack and stylus-loader, we can @require non local files by adding ~ (tilde) character to tell webpack to look for the file in node_modules. Is that the best way?

I believe we don't need to import .styl files from cozy-ui. What we want to import are:

  • styled react components
  • themes
  • css variables

Then we could create an index.html with the <link href="themes.css" rel="stylesheet">, use whatever technology to create local stylesheet using css variables and using styled react components in our own components.

I know there is some incoming The Plan and I would like to have some discussion to make The Plan a usable, used and useful plan. What do you think?

Show number of items in cozy drive directories

Hello,
It would be very useful to know how many items are in a directory, in the cozy drive web interface.
The item count could be displayed after the directory name, or at least when displaying the content of the directory.
Thanks!

Possibility to choose the images folder to upload

Hi,
Actually, I've most of 5Go of photos on Google Photos so they won't be able to enter on Cozy Drive all together.
Could it be possible to allow us to choose the images folder we want to upload from the settings of our account ?
Regards

Sharing view should allow for downloading the whole folder on mobile

I tested this yesterday, but it would appear the share UI doesn't allow for whoever uses the link to access the share to download the folder:
9eec95cc-57e9-48e3-b77c-e868da321cdd
As you can see, the menu at the top is missing entirely. Also, the handles next to the files are non-functional.

I would love to have the same abilities on mobile as I have with the desktop client:
screenshot_2018-07-10 cozy-drive

Share mobile Authentication ducks

Je dois faire en sorte que l'application Cozy Drive et Cozy Bank partagent le composant Authentication pour permettre une mutualisation du composant et ainsi qu'il puisse être facilement réutilisé dans d'autres applications.

Information

Voici le composant coté Drive, coté Bank.

Il contient:

  • des composants reacts (Authenticate, SelectServer, Welcome, Revoke)
  • une partie routeur permettant d'ajouter une route pour l'authentification ou pour la révocation.
  • des traductions
  • des composants cozy-ui
  • des appels à la stack avec cozy-client-js
  • une ouverture de la fenêtre de la stack avec cordova

Les obstacles

Les traductions

On devra créer un projet dans transifex pour permettre la traduction à un seul endroit.

La gestion du routeur

Si on intègres la partie routeur cela veut dire que le composant est lié à react-router v3.

Solution proposé

Je me vois mal mettre ce composant dans cozy-ui. Je verrai plus la création d'une librairie contenant des composants fonctionnels de cozy.

Voici les différentes étapes que je vois:

  • Trouver un nom à la librairie
  • Création d'un dossier spécifique dans cozy-drive/src/libs ou créer un projet séparé ?
  • Copier/Coller le composant src/authentications
  • Créer un package.json avec les dépendances
  • Mettre en place un build Travis pour builder le composant
  • Tester le composant
  • Créer un projet dans transifex
  • Configurer les traductions
  • Ajouter les traductions
  • Importer la version dans cozy-drive + supprimer src/authentication
  • Importer la version dans cozy-bank + supprimer src/ducks/authentication

Flickering of scrollbars

Steps to reproduce :

  • windows 10 / chrome 62
  • After onboarding, I open cozy-drive
  • I have the blue banner at top of screen
  • They are 2 sets of scrollbars (outside : both vertical & horizontal, inside : only vertical. I guess the inside is the normal infinite scroll)
  • I close the banner
  • The outside set of scrollbar starts flickering
  • When I move the mouse onto the list, they disappears and afterwards, everything is fine.

ReactMarkdown PropTypes not respected

On running yarn watch:drive:standalone, I get an error in the browser console:

Warning: Failed prop type: Invalid prop `children` of type `array` supplied to `ReactMarkdown`, expected `string`.
console.(anonymous function) @ console.js:32
printWarning @ warning.js:33
warning @ warning.js:57
checkPropTypes @ checkPropTypes.js:52
propsHook @ preact-compat.es.js:546
newComponentHook @ preact-compat.es.js:518
cl @ preact-compat.es.js:419
createComponent @ preact.esm.js:620
buildComponentFromVNode @ preact.esm.js:850
idiff @ preact.esm.js:397
innerDiffNode @ preact.esm.js:516
idiff @ preact.esm.js:439
innerDiffNode @ preact.esm.js:516
idiff @ preact.esm.js:439
diff @ preact.esm.js:348
renderComponent @ preact.esm.js:769
renderComponent @ preact.esm.js:754
renderComponent @ preact.esm.js:754
rerender @ preact.esm.js:163
Promise.then (async)
enqueueRender @ preact.esm.js:154
setState @ preact.esm.js:951
nextStep @ Authentication.jsx:23
setupSteps @ Authentication.jsx:34
selectServer @ Authentication.jsx:69
eventProxy @ preact.esm.js:308
wrapped @ raven.js:360

It may come from

<ReactMarkdown
className={classNames(styles['description'], styles['info'])}
source={t('mobile.onboarding.server_selection.description')}
disallowedTypes={['link']}
unwrapDisallowed
/>
)}
{error && (
<ReactMarkdown
className={classNames(styles['description'], styles['error'])}
source={t(error)}
/>
)}

Impossible de récupérer l'url des applications depuis cozy-client

Lors que l'on récupère les documents du doctype io.cozy.apps avec fetchCollection ils ne contiennent pas le champ links généré par cozy-stack.

Du coup on est obligé de passer par cozy-client-js pour faire une requête sur /apps.

J'ai l'impression que c'est pas top

Missing interface on GNU/Linux

On GNU/Linux, Cozy-drive interface doesn't show up when the tray icon is clicked. The only thing that appears with a left or right click is a popup menu with only one entry ("Quit").

Tested with Kubuntu 17.10

$ plasmashell --version
plasmashell 5.10.5
$ kf5-config --version
Qt : 5.9.1
Framework KDE : 5.38.0
kf5-config : 1.0

Dependency deprecation warning: node-uuid (npm)

On registry https://registry.npmjs.org/, the "latest" version (v1.4.8) of dependency node-uuid has the following deprecation notice:

Use uuid module instead

Marking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.

Affected package file(s): package.json

If you don't care about this, you can close this issue and not be warned about node-uuid's deprecation again. If you would like to completely disable all future deprecation warnings then add the following to your config:

"suppressNotifications": ["deprecationWarningIssues"]

[Feature] publicly shared files downloadable via wget

Hi,

this is a feature request,

When i share a file via a public link to someone, i would like them to be able to download the file without going to the Cozy web interface and click on download.

Dropbox implemented this mechanism by using a parameter &dl=0, in their public URLs
If you switch the parameter to 1, you can download the file directly:
https://superuser.com/a/486351/270168

It would be great if Cozy implemented this feature too.

Thanks !

current folder - contextual menu

Hi,

I would like to UI-optimize this menu :
screen shot 2018-09-10 at 16 30 08

you can find the precise specs here : https://zpl.io/VYB75zw
to summarize :

  • space between your contextual menu and its button is 0.25 rem
  • we are supposed to have a regular vertical spacing between the menu elements
  • the icons color is supposed to be --slate-grey, not --charcoal-grey

screen shot 2018-09-10 at 16 41 08

Thank you,
Claire

redux-cozy-client overwrites `.type`

If you use documents that have a .type property, redux-cozy-client overwrites it to put doctype information. I have updated my version of redux-cozy-client in bank to fix this issue.

Unfortunately, I could not apply the patch on your version since they have diverged.

Here is the patch :

From b8c1e9b19ccf35e544e2775a5a9a129fffd20011 Mon Sep 17 00:00:00 2001
From: Patrick Browne <[email protected]>
Date: Wed, 27 Sep 2017 18:32:20 +0200
Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9D=20fix:=20do=20not=20overwrite=20.t?=
 =?UTF-8?q?ype=20in=20redux-cozy-client?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/lib/redux-cozy-client/CozyAPI.js              | 20 ++++++++++----------
 src/lib/redux-cozy-client/__tests__/store.spec.js | 10 +++++-----
 src/lib/redux-cozy-client/reducer.js              | 17 ++++++++++-------
 3 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/src/lib/redux-cozy-client/CozyAPI.js b/src/lib/redux-cozy-client/CozyAPI.js
index ea680f1..e6013ec 100644
--- a/src/lib/redux-cozy-client/CozyAPI.js
+++ b/src/lib/redux-cozy-client/CozyAPI.js
@@ -18,7 +18,7 @@ export default class CozyAPI {
       // WARN: looks like this route returns something looking like a couchDB design doc, we need to filter it:
       const rows = resp.rows.filter(row => !row.doc.hasOwnProperty('views'))
       // we normalize the data (note that we add _type so that cozy.client.data.listReferencedFiles works...)
-      const docs = rows.map(row => Object.assign({}, row.doc, { id: row.id, type: doctype, _type: doctype }))
+      const docs = rows.map(row => Object.assign({}, row.doc, { id: row.id, _type: doctype }))
       // we forge a correct JSONAPI response:
       return {
         data: docs,
@@ -47,7 +47,7 @@ export default class CozyAPI {
       wholeResponse: true, // WARN: mandatory to get the full JSONAPI response
       ...options,
       // TODO: type and class should not be necessary, it's just a temp fix for a stack bug
-      fields: [...fields, '_id', 'type', 'class'],
+      fields: [...fields, '_id', '_type', 'class'],
       skip,
       sort
     }
@@ -73,25 +73,25 @@ export default class CozyAPI {
   async fetchDocument (doctype, id) {
     const doc = await cozy.client.data.find(doctype, id)
     // we normalize again...
-    const normalized = { ...doc, id: doc._id, type: doc._type }
+    const normalized = { ...doc, id: doc._id, _type: doc._type }
     return { data: [normalized] }
   }
 
   async createDocument (doc) {
-    const created = await cozy.client.data.create(doc.type, doc)
+    const created = await cozy.client.data.create(doc._type, doc)
     // we forge a standard response with a 'data' property
     const normalized = { ...created, id: created._id }
     return { data: [normalized] }
   }
 
   async updateDocument (doc) {
-    const updated = await cozy.client.data.updateAttributes(doc.type, doc.id, doc)
+    const updated = await cozy.client.data.updateAttributes(doc._type, doc.id, doc)
     // we forge a standard response with a 'data' property
     return { data: [{...doc, _rev: updated._rev}] }
   }
 
   async deleteDocument (doc) {
-    /* const deleted = */ await cozy.client.data.delete(doc.type, doc)
+    /* const deleted = */ await cozy.client.data.delete(doc._type, doc)
     // we forge a standard response with a 'data' property
     return { data: [doc] }
   }
@@ -124,14 +124,14 @@ export default class CozyAPI {
 
   async fetchReferencedFiles (doc, skip = 0) {
     // WARN: _type and _id are needed by cozy.client.data.fetchReferencedFiles
-    const normalized = { ...doc, _type: doc.type, _id: doc.id }
+    const normalized = { ...doc, _id: doc.id }
     // WARN: the stack API is probably not ideal here: referencedFiles are in the 'included' property
     // (that should be used when fetching an entity AND its relations) and the 'data' property
     // only contains uplets { id, type }
     const { included, meta } = await cozy.client.data.fetchReferencedFiles(normalized, { skip, limit: FETCH_LIMIT })
     // we forge a standard response with a 'data' property
     return {
-      data: !included ? [] : included.map(file => ({ ...file, ...file.attributes, type: 'io.cozy.files' })),
+      data: !included ? [] : included.map(file => ({ ...file, ...file.attributes, _type: 'io.cozy.files' })),
       meta,
       next: meta.count > skip + FETCH_LIMIT,
       skip
@@ -145,10 +145,10 @@ export default class CozyAPI {
 
   async removeReferencedFiles (doc, ids) {
     // WARN: _type and _id are needed by cozy.client.data.removeReferencedFiles
-    const normalized = { ...doc, _type: doc.type, _id: doc.id }
+    const normalized = { ...doc, _id: doc.id }
     await cozy.client.data.removeReferencedFiles(normalized, ids)
     return ids
   }
 }
 
-const normalizeFile = (file) => ({ ...file, ...file.attributes, id: file._id, type: file._type })
+const normalizeFile = (file) => ({ ...file, ...file.attributes, id: file._id })
diff --git a/src/lib/redux-cozy-client/__tests__/store.spec.js b/src/lib/redux-cozy-client/__tests__/store.spec.js
index 2205510..4d74f07 100644
--- a/src/lib/redux-cozy-client/__tests__/store.spec.js
+++ b/src/lib/redux-cozy-client/__tests__/store.spec.js
@@ -41,9 +41,9 @@ describe('Redux store tests', () => {
 
   const fakeFetchResponse = {
     data: [
-      { id: '33dda00f0eec15bc3b3c59a615001ac7', type: 'io.cozy.rockets', name: 'Falcon 9' },
-      { id: '33dda00f0eec15bc3b3c59a615001ac8', type: 'io.cozy.rockets', name: 'Falcon Heavy' },
-      { id: '33dda00f0eec15bc3b3c59a615001ac9', type: 'io.cozy.rockets', name: 'BFR' }
+      { id: '33dda00f0eec15bc3b3c59a615001ac7', _type: 'io.cozy.rockets', name: 'Falcon 9' },
+      { id: '33dda00f0eec15bc3b3c59a615001ac8', _type: 'io.cozy.rockets', name: 'Falcon Heavy' },
+      { id: '33dda00f0eec15bc3b3c59a615001ac9', _type: 'io.cozy.rockets', name: 'BFR' }
     ]
   }
 
@@ -66,7 +66,7 @@ describe('Redux store tests', () => {
     describe('When a document is successfully created on the server', () => {
       const fakeResponse = {
         data: [
-          { id: '33dda00f0eec15bc3b3c59a615001ac5', type: 'io.cozy.rockets', name: 'Saturn V' }
+          { id: '33dda00f0eec15bc3b3c59a615001ac5', _type: 'io.cozy.rockets', name: 'Saturn V' }
         ]
       }
 
@@ -76,7 +76,7 @@ describe('Redux store tests', () => {
 
       it('should update collections listed in the `updateCollections` option', () => {
         state = dispatchSuccessfulAction(
-          createDocument({ type: 'io.cozy.rockets', name: 'Saturn V' }, {
+          createDocument({ _type: 'io.cozy.rockets', name: 'Saturn V' }, {
             updateCollections: ['rockets']
           }),
           fakeResponse,
diff --git a/src/lib/redux-cozy-client/reducer.js b/src/lib/redux-cozy-client/reducer.js
index 4a3366f..a65f267 100644
--- a/src/lib/redux-cozy-client/reducer.js
+++ b/src/lib/redux-cozy-client/reducer.js
@@ -16,6 +16,7 @@ const ADD_REFERENCED_FILES = 'ADD_REFERENCED_FILES'
 const REMOVE_REFERENCED_FILES = 'REMOVE_REFERENCED_FILES'
 
 const documents = (state = {}, action) => {
+  let doctype
   switch (action.type) {
     case RECEIVE_DATA:
       const { data } = action.response
@@ -31,18 +32,20 @@ const documents = (state = {}, action) => {
     case RECEIVE_NEW_DOCUMENT:
     case RECEIVE_UPDATED_DOCUMENT:
       const doc = action.response.data[0]
+      doctype = doc._type
       return {
         ...state,
-        [doc.type]: {
-          ...state[doc.type],
+        [doctype]: {
+          ...state[doctype],
           [doc.id]: doc
         }
       }
     case RECEIVE_DELETED_DOCUMENT:
       const deleted = action.response.data[0]
+      doctype = doc._type
       return {
         ...state,
-        [deleted.type]: removeObjectProperty(state[deleted.type], deleted.id)
+        [doctype]: removeObjectProperty(state[doctype], deleted.id)
       }
     case ADD_REFERENCED_FILES:
       return {
@@ -76,8 +79,8 @@ const updateFilesReferences = (files, newlyReferencedIds, doc) => {
   newlyReferencedIds.forEach(id => {
     const file = files[id]
     file.relationships.referenced_by.data = file.relationships.referenced_by.data === null
-      ? [{ id: doc.id, type: doc.type }]
-      : [...file.relationships.referenced_by.data, { id: doc.id, type: doc.type }]
+      ? [{ id: doc.id, _type: doc._type }]
+      : [...file.relationships.referenced_by.data, { id: doc.id, _type: doc._type }]
     updated[id] = file
   })
   return updated
@@ -88,14 +91,14 @@ const removeFilesReferences = (files, removedIds, doc) => {
   removedIds.forEach(id => {
     const file = files[id]
     file.relationships.referenced_by.data =
-      file.relationships.referenced_by.data.filter(rel => rel.type !== doc.type && rel.id !== doc.id)
+      file.relationships.referenced_by.data.filter(rel => rel._type !== doc._type && rel.id !== doc.id)
     updated[id] = file
   })
   return updated
 }
 
 const getArrayDoctype = (documents) => {
-  const doctype = documents[0].type
+  const doctype = documents[0]._type
   // TODO: don't know why the stack returns 'file' here..
   if (doctype === 'file') {
     return 'io.cozy.files'
-- 
2.13.5 (Apple Git-94)

[Feature Request] Embed password Manager within CozyCloud

Hi all,
A very good use for Cozy Cloud could be embedding a password manager within cozy-cloud - or a way to store buttercup or keepass files, and access them via the master password. Another solution: link buttercup directly to the file stored within cozy cloud, but would require modifying buttercup.
Jonathan

[FEATURE] Close viewer modal when pressing the ESC key

I would love to be able to close the viewing modal on web/desktop for filetypes like images by pressing the ESC key. There already is navigation implemented for back and forth, i.e. scrolling through images, but there doesn't appear to be a shortcut for closing the viewer modal.

cozy-drive autostart not working on Arch Linux

Summary

Enabling the auto-start feature does not work on Arch Linux. It starts an empty electron app instead.

Environment

Arch Linux vanilla + Deepin DE

$ uname -r
4.19.2-arch1-1-ARCH
$ pacman -Qe |grep cozy
cozy-desktop 3.10.2-1

Hacking my way around

Activating the auto-start feature seems only to add the file ~/.config/autostart/electron.desktop so I disabled the feature and added the file cozy-desktop.desktop myself. It seems to work as expected now.

Expected behavior

Obviously, the desktop file should be Cozy's one and not electron.

Bug avec le logo de cozy-drive

Lorsque l'on affiche les autorisations lors de la connexion d'un compte à l'application mobile le logo de l'application n'est pas correcte. Nous avons le même soucis coté Cozy Bank mais pas pour les même raisons.

bug_logo

L'url de l'icone : https://raw.githubusercontent.com/cozy/cozy-drive/master/vendor/assets/apple-touch-icon-120x120.png
Le code :

'https://raw.githubusercontent.com/cozy/cozy-drive/master/vendor/assets/apple-touch-icon-120x120.png',

Action Required: Fix Renovate Configuration

There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.

Location: renovate.json
Error type: The renovate configuration file contains some invalid settings
Message: Invalid configuration option: license, Invalid configuration option: name, Invalid configuration option: renovate-config, Invalid configuration option: version

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.