Compare commits
No commits in common. "master" and "creation-form" have entirely different histories.
master
...
creation-f
@ -1,13 +1,12 @@
|
||||
module.exports = {
|
||||
parser: '@typescript-eslint/parser',
|
||||
plugins: ['@typescript-eslint', 'json'],
|
||||
plugins: ['@typescript-eslint'],
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:prettier/recommended',
|
||||
'prettier/@typescript-eslint',
|
||||
'plugin:json/recommended',
|
||||
],
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018,
|
||||
|
3
.gitignore
vendored
@ -5,7 +5,6 @@
|
||||
/tmp
|
||||
/out-tsc/
|
||||
documentation
|
||||
/site/
|
||||
# Only exists if Bazel was run
|
||||
/bazel-out
|
||||
|
||||
@ -53,5 +52,3 @@ Thumbs.db
|
||||
|
||||
# linter
|
||||
.eslintcache
|
||||
|
||||
.ztr-directory
|
||||
|
@ -1,16 +1,15 @@
|
||||
# image: weboaks/node-karma-protractor-chrome
|
||||
image: node:12.22.5
|
||||
image: node:latest
|
||||
|
||||
stages:
|
||||
- build
|
||||
# - pages
|
||||
# - test
|
||||
- test
|
||||
# - e2e
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- node_modules/
|
||||
- .yarn
|
||||
|
||||
#pages:
|
||||
# stage: pages
|
||||
@ -39,10 +38,9 @@ cache:
|
||||
|
||||
build:
|
||||
stage: build
|
||||
before_script:
|
||||
- yarn
|
||||
script:
|
||||
- yarn run build:prod:demobliss
|
||||
- yarn install --pure-lockfile
|
||||
- npx ng build --prod
|
||||
cache:
|
||||
policy: pull
|
||||
|
||||
@ -62,6 +60,6 @@ build:
|
||||
# artifacts:
|
||||
# paths:
|
||||
# - public
|
||||
# expire_in: 30 dateChoices
|
||||
# expire_in: 30 days
|
||||
# only:
|
||||
# - master
|
||||
|
543
CHANGELOG.md
@ -1,542 +1 @@
|
||||
## v0.5.0 (2021-05-04)
|
||||
|
||||
* :zap: remove generated documentation from compodoc [View](https://bitbucket.org/projects/test/repos/my-project/commits/f358120516bbf027e53758c93a581f93bed3d10a)
|
||||
* :book: merge documentation from the wiki in the folder doc [View](https://bitbucket.org/projects/test/repos/my-project/commits/c689a679e21e6e8fd4efff71ef95d555f9c59d82)
|
||||
* :book: update contribute [View](https://bitbucket.org/projects/test/repos/my-project/commits/c4982267d2ae6980ef6f72694cb322ae8bec6092)
|
||||
* :zap: ability to customize app title and app logo in header from environment vars. fixes #87 #88 #89. [View](https://bitbucket.org/projects/test/repos/my-project/commits/621101aa38e5732885aa184174cd1d97a157c49f)
|
||||
* :book: move documentation to doc folder [View](https://bitbucket.org/projects/test/repos/my-project/commits/70acabb056c61da806f565927e063dba66e7592e)
|
||||
* :book: DOC : desired feature added in doc [View](https://bitbucket.org/projects/test/repos/my-project/commits/14d2a109d30d29a1a83d616d3e543d0cdf4bc084)
|
||||
* :alien: i18n header menu, :gears: splits routes, :fix: RED theme fix in switch [View](https://bitbucket.org/projects/test/repos/my-project/commits/b4f496b08dbd2bdea757b9f2feb1007a81d8b86e)
|
||||
* hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/6db96397ea4fc7735f4a921cd8a9a912dafa2221)
|
||||
* remove some broken automation [View](https://bitbucket.org/projects/test/repos/my-project/commits/5f072fe3abee9c0b5cc5126a11188cd5b70a58c7)
|
||||
* only send list of polls by email to user [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5214fdd9757a207ee01a0e263c1ab63df1edc12)
|
||||
* move dev menu slider and show it only in dev mode env [View](https://bitbucket.org/projects/test/repos/my-project/commits/6059533c3635684d8422c2bf1c12a975390af5b4)
|
||||
* start form [View](https://bitbucket.org/projects/test/repos/my-project/commits/8cac3d18621c35f7f3d73fcc699017f04cefdc6b)
|
||||
* add form array for choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/d9301559ef99902c3901afd0ee4a6a5035e77b81)
|
||||
* :hammer: test the build with gitlab CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/41fd153991fb1e324664cd27b9c2d4aca8a4f408)
|
||||
* add variables from env in footer [View](https://bitbucket.org/projects/test/repos/my-project/commits/b0026fabc471d34f718c8aff95fca2a33c0b3623)
|
||||
* start combine choices array [View](https://bitbucket.org/projects/test/repos/my-project/commits/4bec5828b386b4be2d73837c97731997e1588106)
|
||||
* dynamically add choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/8c119739a72fc6767e46791c2341656f53e7fc04)
|
||||
* add all config controls [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5b8d5b65ec32f170610f0186ed08b6fc23a1568)
|
||||
* multiple choices for creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/fa534af3ab200835a16f38c2e7b5998cbadb45f6)
|
||||
* :alien: i18n import po files from previous framadate version [View](https://bitbucket.org/projects/test/repos/my-project/commits/a5b0d2c2d45aa4b58fdd08669568dd7f22b5d795)
|
||||
* :alien: i18n add extraction lib [View](https://bitbucket.org/projects/test/repos/my-project/commits/60eeddbf21a575e84f054afe5defe54e258bb54f)
|
||||
* :bug: select lang wigthout lifecycle bug [View](https://bitbucket.org/projects/test/repos/my-project/commits/10c1930e4d5c4be1ec7d6af208dc939705020e89)
|
||||
* reorder questions [View](https://bitbucket.org/projects/test/repos/my-project/commits/8df2b95c1e287ab7a3a4f0127b8ec616260126dc)
|
||||
* translate homepage [View](https://bitbucket.org/projects/test/repos/my-project/commits/d07f51dd910ad243e030cfd1fdba041f8264d1e2)
|
||||
* togglable advanced options [View](https://bitbucket.org/projects/test/repos/my-project/commits/d3042b3723839f6b4710b77024f0f0fb10a87455)
|
||||
* add keybaord shortcuts on array for choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/4769ecefc3b6b59887baec2625bd5e35f23f6554)
|
||||
* :zap: more settings for admin form with time and answers groups [View](https://bitbucket.org/projects/test/repos/my-project/commits/82910a9aae0750c80b87a04bd1c6e6634e68f05b)
|
||||
* add time to date func [View](https://bitbucket.org/projects/test/repos/my-project/commits/94162c796cf5016634eccdeb18fc132711055eb2)
|
||||
* :alien: convert sentences from framadate1 to json files [View](https://bitbucket.org/projects/test/repos/my-project/commits/a4c2387e1257e9684147bb7af9184d4550fa2b8e)
|
||||
* add sentences in fr and en from framadate 1 [View](https://bitbucket.org/projects/test/repos/my-project/commits/3700ede667e90a43eb39f301a396feacbe05d570)
|
||||
* :art: add pictures from undraw, translate sentences on homepage [View](https://bitbucket.org/projects/test/repos/my-project/commits/04f04d622dea3f963273eb038bc1c99e2832f1ca)
|
||||
* reuse automatic slug from poll config in form [View](https://bitbucket.org/projects/test/repos/my-project/commits/3306e7c29d4f811a6ba624595457768e8c237bcc)
|
||||
* adding reodering of choices beginning [View](https://bitbucket.org/projects/test/repos/my-project/commits/1745762ba3125c7ad054284e4fd6b4020482d6f2)
|
||||
* :zap: add api version config in env [View](https://bitbucket.org/projects/test/repos/my-project/commits/1167b692eaea2ffe711a7a56797ed3017624a184)
|
||||
* add fields to config of poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/4eef4c4220a4b8523e6f7a430afda12c563edaae)
|
||||
* try to get the list of polls [View](https://bitbucket.org/projects/test/repos/my-project/commits/1b49231d924d0c3a69d43d5c02645b4d2621d50c)
|
||||
* create success page and route [View](https://bitbucket.org/projects/test/repos/my-project/commits/03f7c49c519e2db062de3d64a1cfdd8c1f109e05)
|
||||
* spacing buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/d4e5c614a9397fdd7feaa0dc6da1d1160ccd4c52)
|
||||
* split of creation components [View](https://bitbucket.org/projects/test/repos/my-project/commits/84b69a1366dacb521d4295c99eb630f636429ac4)
|
||||
* homepage texts [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d9f1f7d40468d0b2ba3634e7cdd6cbf3f1a8118)
|
||||
* home page reorder and statistics, todo component [View](https://bitbucket.org/projects/test/repos/my-project/commits/5bac37a7905ba1ccd16bab3568a366bf8b9d9090)
|
||||
* link to static pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/1717f738d19e65c22d91b1f429cde654fb677ad0)
|
||||
* include advanced choices and toggle visibility of sub component [View](https://bitbucket.org/projects/test/repos/my-project/commits/feb0de8270204c31cbb92f6a6420644cc1a99e9e)
|
||||
* ordering base fields [View](https://bitbucket.org/projects/test/repos/my-project/commits/f96dc1f3c44b413eef1b64b4ff9ea8abca9fc34a)
|
||||
* link to base config [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d49389d117b8060fd343e7815b0894e4413667d)
|
||||
* add choices for the future [View](https://bitbucket.org/projects/test/repos/my-project/commits/237984c04073efa133ee2fd5ba18ee90a9e16a0e)
|
||||
* harmonizing poll default properties with payload and advanced config [View](https://bitbucket.org/projects/test/repos/my-project/commits/2a4219e14941679da323d1fd066d6fb6ca62e6f9)
|
||||
* testing ciphering page [View](https://bitbucket.org/projects/test/repos/my-project/commits/40c0c3888902b046c9ab9f65549c57abbff5a1c3)
|
||||
* fill poll config default [View](https://bitbucket.org/projects/test/repos/my-project/commits/7140072ecc6d624e6e660cf694ea5d6b4b5c6376)
|
||||
* patch kind of poll with patchvalue [View](https://bitbucket.org/projects/test/repos/my-project/commits/77cf4c6d04b5a7c7689e834dcc166dd5eca56b22)
|
||||
* advanced button change color when active [View](https://bitbucket.org/projects/test/repos/my-project/commits/ce00a3ce695e7e6728bdeace31a66cc17359dcab)
|
||||
* translate calendar contents, space options for days [View](https://bitbucket.org/projects/test/repos/my-project/commits/2edb828aa3a1e0d9e39f4abc6eefc0e0ef06c96b)
|
||||
* visual sections for date selection [View](https://bitbucket.org/projects/test/repos/my-project/commits/de679721d1047d8ee7d780b23f0298b47af7bb21)
|
||||
* drag and drop time interval [View](https://bitbucket.org/projects/test/repos/my-project/commits/7ca87e28b44887138b0b8b05bde47cca9024d990)
|
||||
* display hour ranges [View](https://bitbucket.org/projects/test/repos/my-project/commits/5f4c2e04af08c896f3fb64d56157d007600f6f04)
|
||||
* use crypto lib [View](https://bitbucket.org/projects/test/repos/my-project/commits/1ab5255bfa2aff83774132965842e357eb8494e4)
|
||||
* add lib crypto [View](https://bitbucket.org/projects/test/repos/my-project/commits/4df2e00cbe228a19b10821be5025c0b11aeb27da)
|
||||
* copy button [View](https://bitbucket.org/projects/test/repos/my-project/commits/760bde7e3069e6c2f84724b05c80c7260f7fc2a7)
|
||||
* easy ciphering working with and without salt [View](https://bitbucket.org/projects/test/repos/my-project/commits/3e0c1ff3750a5f986dd850b6a6b765e19b8a1ad5)
|
||||
* mixed salt for ciphering [View](https://bitbucket.org/projects/test/repos/my-project/commits/0885df23df39b20fa8ee16aa7c2b3fb1c13a8ec3)
|
||||
* spacing dev menu button [View](https://bitbucket.org/projects/test/repos/my-project/commits/51de2b2e028305eabfdb9c6bb91a5758aa815344)
|
||||
* add md5 lib to ciphering page [View](https://bitbucket.org/projects/test/repos/my-project/commits/d72e7763da7e60d551b3ee585555bfa83e6ddd11)
|
||||
* listing char codes [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5411ab425368ce6e3a7b024e8d9fb711e041018)
|
||||
* compute entropy [View](https://bitbucket.org/projects/test/repos/my-project/commits/ddf5b40ef45290430f2c681ae0368ee2b98abecf)
|
||||
* resize table for entropy [View](https://bitbucket.org/projects/test/repos/my-project/commits/e32db4983d014403c97e93a3faebb7ab2e318a59)
|
||||
* compare entropy with generated pass [View](https://bitbucket.org/projects/test/repos/my-project/commits/e9a9d1a959b8141bdb56fe01d8d0ae7bcf2c8b06)
|
||||
* chiffrement matrice ok [View](https://bitbucket.org/projects/test/repos/my-project/commits/73ad7426ee1f1b1b31f252ea30d16a810272d792)
|
||||
* hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/54ece76c7e916aa919d9e5abaca69efd7c12968d)
|
||||
* fix types [View](https://bitbucket.org/projects/test/repos/my-project/commits/7b5cf59b9979f0da70af0f0ba7dd07c743ec851d)
|
||||
* update env for prod [View](https://bitbucket.org/projects/test/repos/my-project/commits/3c3dddafa52f520658a70291b66fd42505aeee48)
|
||||
* fix some production build warnings [View](https://bitbucket.org/projects/test/repos/my-project/commits/2993fc5cb5204bfd35ddc393b6805176e150461b)
|
||||
* add stats [View](https://bitbucket.org/projects/test/repos/my-project/commits/2af45ae72708bec310febde7cbcf33020a1b83f0)
|
||||
* using hash routes [View](https://bitbucket.org/projects/test/repos/my-project/commits/e63bbab75565370cdafe1c374bea97f5d777c71f)
|
||||
* hide some components [View](https://bitbucket.org/projects/test/repos/my-project/commits/f3f2d6623bb1bc7aa8d36d2144ac46a47c98470a)
|
||||
* choice template questions [View](https://bitbucket.org/projects/test/repos/my-project/commits/21040df287ccb46e9384273b6a352378a1d4ba76)
|
||||
* date selector as question answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/4a89b715a9e9a9f058c64f3384bd115a89170138)
|
||||
* add theming in vars with blue variation [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2806371585ba1d1810bfbb2edc977264fd6ba5d)
|
||||
* default colors [View](https://bitbucket.org/projects/test/repos/my-project/commits/a744bf9931e472afd6a01bbb343c19a6fe095b03)
|
||||
* setup theme comments [View](https://bitbucket.org/projects/test/repos/my-project/commits/2562b21d2ff9686d8a4cc35645f7ebed81093cd3)
|
||||
* add fetching a poll with a pass hash [View](https://bitbucket.org/projects/test/repos/my-project/commits/3850f3811c135005131bdffef8cd760fa9cb9fb5)
|
||||
* manage consultation path [View](https://bitbucket.org/projects/test/repos/my-project/commits/6cb32cb2e19276e28ee3d6c5bc7777a00edfc8ea)
|
||||
* display de sondage de démo [View](https://bitbucket.org/projects/test/repos/my-project/commits/21aa634ce52beeab60bfc402178840f1f2eb0769)
|
||||
* montrer consultation et préciser si aucun vote [View](https://bitbucket.org/projects/test/repos/my-project/commits/56273946c3f598e58df960a56756d877d443ece7)
|
||||
* display title on poll page [View](https://bitbucket.org/projects/test/repos/my-project/commits/d84809d62a032dbe37d8da746fec12fc486a7fca)
|
||||
* style on selected items in consultation page [View](https://bitbucket.org/projects/test/repos/my-project/commits/0c08e802c9a98d4182853092d615b4fd5f4994b1)
|
||||
* scroll to top on route change [View](https://bitbucket.org/projects/test/repos/my-project/commits/74a928800edd8d67cfc428eb67d27aaddc33cffa)
|
||||
* send form in dev mode, fill title demo [View](https://bitbucket.org/projects/test/repos/my-project/commits/215178efa9c6a3bc5e07d11b97dd0109ab356899)
|
||||
* add comment on display [View](https://bitbucket.org/projects/test/repos/my-project/commits/078f63f742d29e5c1cb7426560047830f165ea97)
|
||||
* export results added, models updates [View](https://bitbucket.org/projects/test/repos/my-project/commits/1e90d92ab9f6c25643600a254d032c486516a692)
|
||||
* transmettre l'information d'expiration du sondage au front [View](https://bitbucket.org/projects/test/repos/my-project/commits/163b89b03ffc11c277f916379cb5631b0256d3af)
|
||||
* fix models for backend update [View](https://bitbucket.org/projects/test/repos/my-project/commits/e45b490c2fdbdff37e5a252a478091b52b287612)
|
||||
* key created_at for comment, format date [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d3457cf6fa872fe277dcff3a43b93d8be5353a7)
|
||||
* show counters on answers and favourite answer [View](https://bitbucket.org/projects/test/repos/my-project/commits/0abf924caedeebe008292c230dae3a2af40f028f)
|
||||
* display details too [View](https://bitbucket.org/projects/test/repos/my-project/commits/9a4a72a24c781e24f773462c8978cf59ded6821b)
|
||||
* info in modal [View](https://bitbucket.org/projects/test/repos/my-project/commits/729dac95993b4997eae4691bcfaec2630714a8aa)
|
||||
* fixes for building in prod [View](https://bitbucket.org/projects/test/repos/my-project/commits/7a0061eeb1d2018857a78dcff9674df2076c0999)
|
||||
* stack of vote relié au formulaire de commentaire [View](https://bitbucket.org/projects/test/repos/my-project/commits/620a7b99fac22a6809149d753410f5bf885c0570)
|
||||
* set choices and toggle votes in votestack [View](https://bitbucket.org/projects/test/repos/my-project/commits/f1e6b5955ee16f4ec65828f6bd48930b606b879e)
|
||||
* display stack answer and toggle fluently between answers to votes [View](https://bitbucket.org/projects/test/repos/my-project/commits/4464a0af2cae1c9c9c25c6b1762d28634c3b4207)
|
||||
* default value of vote added [View](https://bitbucket.org/projects/test/repos/my-project/commits/cbc4bd8f5d85b0a6f1e3bc797c47564cee5c4e62)
|
||||
* choice button refacto [View](https://bitbucket.org/projects/test/repos/my-project/commits/3abef619c8ce77cc1f9ba014a952fbb96456b01d)
|
||||
* send stack of votes button linked to api [View](https://bitbucket.org/projects/test/repos/my-project/commits/7a83beae8e5ca64c21759b3337de0ecb30c06937)
|
||||
* trying to send vot stack but getting CORS issue [View](https://bitbucket.org/projects/test/repos/my-project/commits/30d4adec373ae2714b25d46e704beef73785cfc0)
|
||||
* use httpclient [View](https://bitbucket.org/projects/test/repos/my-project/commits/e61542b6521722eafafb989dd88fa482ae07caac)
|
||||
* default backend to framadate demo api [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2b8056b7eb35fef9de30adc7c897ee6c5d2d2a5)
|
||||
* add good hash in route [View](https://bitbucket.org/projects/test/repos/my-project/commits/d5bc5777b787060dfaa84c1ed7599bff272b5507)
|
||||
* move old stuff [View](https://bitbucket.org/projects/test/repos/my-project/commits/fdcb7327f0b65a4ce8c7ae6f8a5bec9f5592c026)
|
||||
* rename utils services [View](https://bitbucket.org/projects/test/repos/my-project/commits/b9181b5b3fe6b7163ffefbb0bea3e70a186bee53)
|
||||
* auto send vote in dev mode [View](https://bitbucket.org/projects/test/repos/my-project/commits/3a89645e66b9445e61bf67c50805b9682a538931)
|
||||
* manage mobile menu, and add poll title to page title [View](https://bitbucket.org/projects/test/repos/my-project/commits/31f0f19a9ae2120ac3394414e79649a44ee2de14)
|
||||
* nav disable default show [View](https://bitbucket.org/projects/test/repos/my-project/commits/78a88d3163f73a161649a0ed17d4038f458d5bcc)
|
||||
* nav items for demos in mobile menu [View](https://bitbucket.org/projects/test/repos/my-project/commits/69f8eac147f413a1f7bbb9c2d2b12b6526e63419)
|
||||
* change icons for answer [View](https://bitbucket.org/projects/test/repos/my-project/commits/9e4d5187b523891568387526e1a7cc749d6a5a44)
|
||||
* toast message on error send vote stack [View](https://bitbucket.org/projects/test/repos/my-project/commits/765299e1c3ae69bebfbad281592d9460ef4f9aa4)
|
||||
* creation poll style, fill DTO for creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/585d3a215e62ee115d0bace3c5bc0c6f650c2b59)
|
||||
* auto save on dev env [View](https://bitbucket.org/projects/test/repos/my-project/commits/12a41b502217ce8c2f0df9673ca7a21f80550409)
|
||||
* flatten form fields [View](https://bitbucket.org/projects/test/repos/my-project/commits/d08bba4fcb4ffbb5b4b28cd948babc21059b8bfe)
|
||||
* advanced fields flattened [View](https://bitbucket.org/projects/test/repos/my-project/commits/e405a09c78af01fdb02a0fa7b4f75fc92cee7c34)
|
||||
* splitting date choices with a separator [View](https://bitbucket.org/projects/test/repos/my-project/commits/975997b7675876f5596e34533e50d76f1c6c8809)
|
||||
* group display of days [View](https://bitbucket.org/projects/test/repos/my-project/commits/86c0ff815f824b9119d36482cd85fc668eccf7cb)
|
||||
* ability to toggle answers on grouped choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/16db2a69cf687e2f99b9faec96e87c4d89d06458)
|
||||
* update url to copy after creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/bfdb18b316ffaf614b58a33ebdb195d1e793cc0a)
|
||||
* link function [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2ee8ec668d252a23389780f977bba3c58a79512)
|
||||
* hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/dc382017a2ab64fddbe6ca6f31b8419f24e8c0b3)
|
||||
* fix url public [View](https://bitbucket.org/projects/test/repos/my-project/commits/59cb917ea36ac9cb4b21fb2d93fe01bc067c8935)
|
||||
* fix test kind [View](https://bitbucket.org/projects/test/repos/my-project/commits/ed13c98b99048078a9ff3bd23ff32ab34f68c349)
|
||||
* hash routes re enabled [View](https://bitbucket.org/projects/test/repos/my-project/commits/d7a35e91edb3d6f75ddb0946d8d288b20627c925)
|
||||
* fix get participation url [View](https://bitbucket.org/projects/test/repos/my-project/commits/9a013f6d2cd29832d98fa81352f39db0a12fe60c)
|
||||
* better mix on creation of poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/d40aa6a3ae0152f53da4f29379800ab146b8fc89)
|
||||
* no auto send form [View](https://bitbucket.org/projects/test/repos/my-project/commits/c3026639948ce0b4adc5ef22704c076e79407fbd)
|
||||
* fix deps to config prop [View](https://bitbucket.org/projects/test/repos/my-project/commits/e7343810d5612f5ce30d41536c5c9a1d77093d31)
|
||||
* env message demo dans le header [View](https://bitbucket.org/projects/test/repos/my-project/commits/d222d88872012f4cf22c34da9370bb6d2cba5d71)
|
||||
* home display stored polls [View](https://bitbucket.org/projects/test/repos/my-project/commits/1bfe747e4cd256a42bd4c17f9b25fc1c3175131a)
|
||||
* more responsive menu header [View](https://bitbucket.org/projects/test/repos/my-project/commits/bf1df96dcdbdf15905a8db2d61716466c838cfd8)
|
||||
* enable loading state in api creation, success page update [View](https://bitbucket.org/projects/test/repos/my-project/commits/a969b30a03bd6e2ab93d352b5fceccd8420b6983)
|
||||
* add to local polls after creation, update poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/10177d793bf0af056f96e4873b4bbfd12d7c0bee)
|
||||
* fix icon [View](https://bitbucket.org/projects/test/repos/my-project/commits/f6b522748a3e78735926764580a08145def159de)
|
||||
* display of success links [View](https://bitbucket.org/projects/test/repos/my-project/commits/1755f205ad41e6b10fa8b656746d65e578456bbc)
|
||||
* update custom_url with title [View](https://bitbucket.org/projects/test/repos/my-project/commits/f1e5903d0aa2d444b9dd5dc1ecdf3f30e2b61f22)
|
||||
* smaller uniq id in custom_url [View](https://bitbucket.org/projects/test/repos/my-project/commits/5d39b7aa3e5f045f4270729f6c6daa2cd9ea79a9)
|
||||
* erasable button on first field [View](https://bitbucket.org/projects/test/repos/my-project/commits/6fdb56786aa1cbd33badb80d00184aefcf6b64bd)
|
||||
* same time span for every day by default, clean config [View](https://bitbucket.org/projects/test/repos/my-project/commits/c0ca623885d923c873c7d5796f1f687dfa148f8e)
|
||||
* display time slices [View](https://bitbucket.org/projects/test/repos/my-project/commits/af4dfacec9107678069b2dd909473ac68549a728)
|
||||
* empty and reset time slices [View](https://bitbucket.org/projects/test/repos/my-project/commits/1d8aeb2f54711709cd6209fde3615c43e2d78598)
|
||||
* display all on creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/d7eac8d56c68923b74516d688eeea3d421201567)
|
||||
* display fields errors [View](https://bitbucket.org/projects/test/repos/my-project/commits/9cd847be8f099509a55518b092b1d0645c1967ee)
|
||||
* less logs for validation [View](https://bitbucket.org/projects/test/repos/my-project/commits/186e5e36da6f4b424df0e127d7f52980551ef787)
|
||||
* separate choice from form [View](https://bitbucket.org/projects/test/repos/my-project/commits/f6ce22480cbd1fe1ed9e1bb0a038cc6df8fa2030)
|
||||
|
||||
|
||||
## v0.4.0 (2020-06-26)
|
||||
|
||||
* Ajout du lien vers le rendu [View](https://bitbucket.org/projects/test/repos/my-project/commits/983c64a1b4f542d743ee8f1029a4ca8662a3df95)
|
||||
* Pose les textes de la première page de la maquette [View](https://bitbucket.org/projects/test/repos/my-project/commits/e9a85fe44a505a0444d72ae43e0a6a2e8003da3e)
|
||||
* Changement de la structure HTML de base, inspiré de https://github.com/DavidBruant/better-defaults [View](https://bitbucket.org/projects/test/repos/my-project/commits/57b023425107ff786381339dab09e0344e03eb26)
|
||||
* Habillage minimum de l'accueil [View](https://bitbucket.org/projects/test/repos/my-project/commits/2ca0982f6ee7181e701680d9ee63108bc34028d3)
|
||||
* Ajoute les pages statiques de la navigation [View](https://bitbucket.org/projects/test/repos/my-project/commits/fac4efab3c48c70a0527641f0504031878141502)
|
||||
* Ajoute un script docker pour lancer un serveur localement pour développer sur la maquette [View](https://bitbucket.org/projects/test/repos/my-project/commits/e30135786a4f6c3d39588afa00d17491a9406d1d)
|
||||
* Documente le processus pour lancer le projet localement [View](https://bitbucket.org/projects/test/repos/my-project/commits/caf4cf7d2c7dd4969929c6290ab311df44bf1eaf)
|
||||
* Ajout du parcour vers le sondage classique [View](https://bitbucket.org/projects/test/repos/my-project/commits/a248b803079b2ae58d86e8fa1b3e2cdb57fd8f74)
|
||||
* ajout des champs de formulaire dans la page notifications [View](https://bitbucket.org/projects/test/repos/my-project/commits/1cc8e6beb442d3b365b73f0be2f525ff9f1bcb0d)
|
||||
* Création du fichier js [View](https://bitbucket.org/projects/test/repos/my-project/commits/cb07e90e63ae8ec4ab1f91fe01630f7cc0cd8770)
|
||||
* Ajoute le lien vers les natural language form [View](https://bitbucket.org/projects/test/repos/my-project/commits/b3b9797e8cd437efefee1ae6028dba433d62874e)
|
||||
* Bifurcation sur le sondate en fonction du choix [View](https://bitbucket.org/projects/test/repos/my-project/commits/0f6abfa7b9ceea6fdd0d17366e77ea3929b9beb0)
|
||||
* Usage du localStorage [View](https://bitbucket.org/projects/test/repos/my-project/commits/affb5500e734c94aa6526d1e8106f3b849871160)
|
||||
* Ajoute la ponctuation [View](https://bitbucket.org/projects/test/repos/my-project/commits/23902aca1fb69cd40556896be744bfbf053dd8b8)
|
||||
* Affiche un texte par défaut, et propose une popup pour saisi [View](https://bitbucket.org/projects/test/repos/my-project/commits/053d24c158c6e55888f42262d481d6bfb30e8013)
|
||||
* Changement du nom, sans javascript, ou avec [View](https://bitbucket.org/projects/test/repos/my-project/commits/bf23bee2827d9197b646168c1a6606c13f890ed4)
|
||||
* Généralise l'usage du champs text [View](https://bitbucket.org/projects/test/repos/my-project/commits/105b98388573ba5d6a1abe91a9e5b67db51c9169)
|
||||
* Embelli les deux champs texte de la fin de sondage [View](https://bitbucket.org/projects/test/repos/my-project/commits/3229d14993c61eeb595971191c6b86c76707bb9d)
|
||||
* Embelli le champ texte de l'index [View](https://bitbucket.org/projects/test/repos/my-project/commits/44b60adba0ee9c5b6ac515a926d7f4960023ba32)
|
||||
* Base de reflexion pour l'ajout d'option [View](https://bitbucket.org/projects/test/repos/my-project/commits/91b94e806f1572a096d655932f352c26540c312c)
|
||||
* Deploy on funky [View](https://bitbucket.org/projects/test/repos/my-project/commits/0ec23c03d3d16bc5f0979f678e696bdfed4f63a0)
|
||||
* Update .gitlab-ci.yml [View](https://bitbucket.org/projects/test/repos/my-project/commits/9a045b4608b87d85f3ace567042991dab7b85828)
|
||||
* Update .gitlab-ci.yml [View](https://bitbucket.org/projects/test/repos/my-project/commits/8ecb77c322df2b3d331c8a60b3c61bd7ac797d9a)
|
||||
* Update .gitlab-ci.yml [View](https://bitbucket.org/projects/test/repos/my-project/commits/5edd7c6cd5edfae997ec2e4cece9fc524e51cebe)
|
||||
* give up on bash & alpine [View](https://bitbucket.org/projects/test/repos/my-project/commits/ee2dfb7002c1a553e123f58ff1b3a5b1df7f63f4)
|
||||
* Recherche de sondate en deux temps [View](https://bitbucket.org/projects/test/repos/my-project/commits/55ca50890f7d132bb626811aa9e50cce24d5f996)
|
||||
* Déplace la date plus haut dans la page des notif. [View](https://bitbucket.org/projects/test/repos/my-project/commits/4d8e493c7049fbb9299c2b93fe2e914518c88f4c)
|
||||
* Selectionne les options d'un sondage dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/d151724e87b20500d19c022fa3a8f90066dfa533)
|
||||
* Ajoute des informations sur la page de validation [View](https://bitbucket.org/projects/test/repos/my-project/commits/23b43fe5345f9a8fe2b6e77531def3eabb8a8125)
|
||||
* Ajoute une option image + lien [View](https://bitbucket.org/projects/test/repos/my-project/commits/cdbe0a12e16156ae2ab7a4a854fdb57dd806d644)
|
||||
* Ajout d'un champ texte en cas de sondage classique [View](https://bitbucket.org/projects/test/repos/my-project/commits/45319fcfd65a784f8e312a621cf3d1faaccfac6b)
|
||||
* changement de l'URL de demo [View](https://bitbucket.org/projects/test/repos/my-project/commits/d48879c8f651ac4cd288d9914903fcd9d34ab671)
|
||||
* fix(#16): amélioration de l'affichage de la page dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/d4ad832004e399a289c9fa960a30caf38e6b4570)
|
||||
* fix(#3): amélioration du design des boutons [View](https://bitbucket.org/projects/test/repos/my-project/commits/7505340c037682cf2894079aed1177499a162542)
|
||||
* fix(#4): proposition d'amélioration d'affichage des champs textes [View](https://bitbucket.org/projects/test/repos/my-project/commits/19905b208e224eb77127e664cbc6b54aeee2a5d1)
|
||||
* fix(#5): amélioration de l'apparence du textarea [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2c79980c3ef4047bf0a073fe73f5220e3ebf737)
|
||||
* fix(#15): amélioration du design de la page validation [View](https://bitbucket.org/projects/test/repos/my-project/commits/08b4e8bed0123a363f4f7d4edc6f0a11fbce2074)
|
||||
* changement de la taille de typo [View](https://bitbucket.org/projects/test/repos/my-project/commits/d99f3af9212c328a3b20d626ca542117dcc69e4a)
|
||||
* amélioration de l'affichage de l'email [View](https://bitbucket.org/projects/test/repos/my-project/commits/f566c30ee129d736c48f7a7af404bf3e8b244d38)
|
||||
* ajout du style de bouton primary [View](https://bitbucket.org/projects/test/repos/my-project/commits/0ffbdca9ad4495124c386ab84fd15c55214e6809)
|
||||
* amélioration de récapitulatif [View](https://bitbucket.org/projects/test/repos/my-project/commits/925ad5a5575af5414457b50cc6944e41d6da2591)
|
||||
* ajout d'une classe bold [View](https://bitbucket.org/projects/test/repos/my-project/commits/77329039772e1342c03d46431b3034757f919010)
|
||||
* amélioration affichage champs email [View](https://bitbucket.org/projects/test/repos/my-project/commits/bf4ccd61643aea3bdfdf7502ab693569706e1edb)
|
||||
* proposition affichage des dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/e3be6ad85a8dcea0dde9c0621b253e96d2a46cb3)
|
||||
* amélioration de l'affichage des icones [View](https://bitbucket.org/projects/test/repos/my-project/commits/de5e3604b7524952940dbc494f328f34737d1d94)
|
||||
* amélioration de l'affichage des icones [View](https://bitbucket.org/projects/test/repos/my-project/commits/531fd91aef8a8852085bd55202192fab76aa8eda)
|
||||
* Ajoute des dates, et les enregistres dans le localStorage [View](https://bitbucket.org/projects/test/repos/my-project/commits/8f309740c18e25586434e9095f51ab064c9a9587)
|
||||
* Affiche le titre du sondage dans la page de validation [View](https://bitbucket.org/projects/test/repos/my-project/commits/b1ab16bd11195294e080ecbd7a903191be55cc6a)
|
||||
* Récupère l'ancien framadate [View](https://bitbucket.org/projects/test/repos/my-project/commits/50e56a0396610ac4f970b7ecc1702222c1981421)
|
||||
* propose un champe vide par défaut [View](https://bitbucket.org/projects/test/repos/my-project/commits/4a6b039fa974e2df5b7062ee3079873f33c3949a)
|
||||
* Met à jour le readme [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5a4cde537a40691fbe2ac5dd2bacd7ea59dba76)
|
||||
* Utilise un sondage spécial date par défaut [View](https://bitbucket.org/projects/test/repos/my-project/commits/90c014222f5322ca34cdfeb5c8720cd30e69e966)
|
||||
* revois la page suivante par defaut [View](https://bitbucket.org/projects/test/repos/my-project/commits/2c9d5fa912e2ceb2cb32e1ad573d898d88305a8f)
|
||||
* affiche uniquement les options nécessaire pour les date [View](https://bitbucket.org/projects/test/repos/my-project/commits/18d649dab9201c33ce156f5450d2d68dba7d1a47)
|
||||
* reformule le texte de la page des dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/eb79e6161117d5155482249536f053e6e24c9589)
|
||||
* affiche les horaires dans un sondage spécial dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/a5f3e96ad190b6c19c6f84f57884cf3892c13a8f)
|
||||
* ajoute un bouton pour ajouter des horaires [View](https://bitbucket.org/projects/test/repos/my-project/commits/9c27b43d3bbd17ece53edde92b4ea85334f66d1c)
|
||||
* affiche le récapitulatif en fonction des dates qui ont été saisies [View](https://bitbucket.org/projects/test/repos/my-project/commits/f6ded6f5fa2df0eb957f6512b8772eb09e2f938b)
|
||||
* passage à du plus joli [View](https://bitbucket.org/projects/test/repos/my-project/commits/b5581c7127d96ee75856242b076b1b4632dea8d4)
|
||||
* Dossier screenshots pour voir l'avancement ! [View](https://bitbucket.org/projects/test/repos/my-project/commits/91460d407700f2e6feac19e97c8d9468aef83d23)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/d6c81848ea028fc10d746dbd31f2434cece8f137)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/f5cd418a5767dc70413be45285c34f5623c5117f)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/018987e6ae0dad4b878baa828ffa50ce7b82b531)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/3f80ba64ee15bd497699fafdd26e6b7a3c9540db)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/a46d24f267463b31a27a16967de7d1928c813f77)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/376f093a00f958979e09913cc708a69cca27fed2)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/18b984d478d974df5cd5db47d9306c3c95a02a2e)
|
||||
* ajoute un lien vers l'exmple de natural language form [View](https://bitbucket.org/projects/test/repos/my-project/commits/e22559a6462240b69cfc74f522bb183542743f5f)
|
||||
* Restart from scratch [View](https://bitbucket.org/projects/test/repos/my-project/commits/39242f22dbf321461d49bbf47f87274219210626)
|
||||
* removed useless files [View](https://bitbucket.org/projects/test/repos/my-project/commits/61f69c926e879604936f73e3fe4726dbd8ee5dda)
|
||||
* :tada: initialize Angular version of Framdate funky front end [View](https://bitbucket.org/projects/test/repos/my-project/commits/40b1a7bbf9c67f85d21c4212a7af51f9cb98d07b)
|
||||
* hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/512d569c54ce255f329a6883b1ba1c0bd86ffc18)
|
||||
* :zap: make routing, link data with poll config. :art: style sheets [View](https://bitbucket.org/projects/test/repos/my-project/commits/d5f71504dc66c12a0ec9df91b5fb6a646aa098fc)
|
||||
* real example of config [View](https://bitbucket.org/projects/test/repos/my-project/commits/c048c35b9d6aad8664ecd2fb208f047a1ab3eefc)
|
||||
* :zap: example of navigation [View](https://bitbucket.org/projects/test/repos/my-project/commits/42f229f686bcf61ea4d8e3c877847937a12ae16e)
|
||||
* :zap: example of navigation [View](https://bitbucket.org/projects/test/repos/my-project/commits/46cce96dab991af2de358e66daadbff9dda5079d)
|
||||
* :zap: rename components [View](https://bitbucket.org/projects/test/repos/my-project/commits/e238b0aceb1fb2776242ef74cba46b5d27feebd7)
|
||||
* :zap: make pages components, split config of poll from service [View](https://bitbucket.org/projects/test/repos/my-project/commits/56aa09df3bb71342aafd31ce95cba6e2733d1767)
|
||||
* :zap: make pages components and nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/49f4b4c13b555e0498d7bc2c8770e446d2ec2968)
|
||||
* :zap: sync answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/d413774d3b473c5355e2a52f1d0f73efa90b3ab8)
|
||||
* :zap: ability to add a new answer and focus [View](https://bitbucket.org/projects/test/repos/my-project/commits/488b9f677ac9048062304a55f9ad6d6ff5630444)
|
||||
* :zap: all steps and demo page [View](https://bitbucket.org/projects/test/repos/my-project/commits/54c7c6568d2cba66d0088b5bd0b8f3c401645445)
|
||||
* focus via injected document [View](https://bitbucket.org/projects/test/repos/my-project/commits/d9b81d3d8ef5001fd7e199afcd05051263b21973)
|
||||
* Correcting routing at the end of the form [View](https://bitbucket.org/projects/test/repos/my-project/commits/504d8faddf5ff608e63e2081bbbc2ab880860632)
|
||||
* add fonts folder [View](https://bitbucket.org/projects/test/repos/my-project/commits/3fa61053a53518c57ba142ffee180f1cf9c9732d)
|
||||
* fix(styles files): improve styles folders [View](https://bitbucket.org/projects/test/repos/my-project/commits/74b991362aa181ac64fa2882cd5ed3a1142d1536)
|
||||
* Ajouter un nouveau dossier [View](https://bitbucket.org/projects/test/repos/my-project/commits/c77792b0575902f8b52b80483808a672fbc1cf8c)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/c0491a433b2556c917fcd0771b20bf0026ef07a4)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/9a9450dc0dcf23b8931fea51ae90455947a95e87)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/0c00813056699d552f5990f825dd9612fc5443ab)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/51540252844a8019cde41f4137effa10546127d8)
|
||||
* Ajouter un nouveau dossier [View](https://bitbucket.org/projects/test/repos/my-project/commits/04d6a1b430214853e235fad96c5d8b9707114063)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/5cada8fc32beb844e0cd78a5bf3a084d10f2e05c)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/c1bf0631571d25cb669288caab7c1a74f14fa9a8)
|
||||
* :zap: change privacy of properties [View](https://bitbucket.org/projects/test/repos/my-project/commits/d5e5550c54102ca3e1ddf3988139f036a09bcd9a)
|
||||
* :zap: page creation or retrieve start [#28] [View](https://bitbucket.org/projects/test/repos/my-project/commits/6532538da3dfc07b9fdd328a984b431868580a67)
|
||||
* styling in mobile column [View](https://bitbucket.org/projects/test/repos/my-project/commits/56a7271325dde04724aa1648e4cb3433b56020d9)
|
||||
* :zap: lien entre multiple dates et config [View](https://bitbucket.org/projects/test/repos/my-project/commits/d941d6bed86ed922667c9fd806709efc96e6c236)
|
||||
* :art: style of cursor hovering buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/16e8ab4ec5d3fb2cd522ca890066a653f230939c)
|
||||
* :zap: add my name input in first form [View](https://bitbucket.org/projects/test/repos/my-project/commits/8eecb506c3c448273a2d52fc7f28733b09e93717)
|
||||
* Remove my editor config files [View](https://bitbucket.org/projects/test/repos/my-project/commits/4bb851640bba5054c282e97144d8916bc5aa1957)
|
||||
* Add calendar component [View](https://bitbucket.org/projects/test/repos/my-project/commits/9dace55091d8f8d5cfe72764a2ac54d0fa1de2a8)
|
||||
* added web fonts [View](https://bitbucket.org/projects/test/repos/my-project/commits/7fcd13f05a1d07be698cb40f6855c3181a2f169f)
|
||||
* Modification de la page de création [View](https://bitbucket.org/projects/test/repos/my-project/commits/189f5915c17604a6ced866a98ee735fdf73dffe7)
|
||||
* added bootstrap reboot as a CSS reset [View](https://bitbucket.org/projects/test/repos/my-project/commits/ce53ccf55f9370bc1da8202189497d9178a44c45)
|
||||
* improved heading code [View](https://bitbucket.org/projects/test/repos/my-project/commits/918999178495e5541498a02a4b495bf3b324863f)
|
||||
* Modification des liens [View](https://bitbucket.org/projects/test/repos/my-project/commits/13144d5b8c28986a450170f2421a34482b66da59)
|
||||
* ordered links file + added sass [View](https://bitbucket.org/projects/test/repos/my-project/commits/5ae1aeabeb561bff94758b50b61e9d26c83480ad)
|
||||
* improve markup, hide useless decortion for a and h1 in header [View](https://bitbucket.org/projects/test/repos/my-project/commits/c47e00a82481c8c0415b137b406623d0d63f9bd2)
|
||||
* improve global display [View](https://bitbucket.org/projects/test/repos/my-project/commits/74285393d885870340ecb60a6d8b79f360abfaea)
|
||||
* Adding basic date filling [View](https://bitbucket.org/projects/test/repos/my-project/commits/9031b60178bf2c4a25bc596161429fa6a24858c2)
|
||||
* :art: organize fonts in folders [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d03578a1d6fef9431a79950b1e24f13c71ce44c)
|
||||
* :art: remove blue in links of the bootstrap lib, add strike line on create button [View](https://bitbucket.org/projects/test/repos/my-project/commits/07989e454fb4df951177831a0e3d793cbba54198)
|
||||
* :art: striked button and icon style [View](https://bitbucket.org/projects/test/repos/my-project/commits/29bfe45acac4905a4f9df4f343993beebe9c6fee)
|
||||
* :bug: remove page folder, refacto in pages folder for creation page [View](https://bitbucket.org/projects/test/repos/my-project/commits/8291f2d8de90b54f4bd6dac6d4384589f8eabdf8)
|
||||
* fix(headings): moved h1 with border to component [View](https://bitbucket.org/projects/test/repos/my-project/commits/1753515797ddca6d20ee3464d73e0421332abdec)
|
||||
* style(default): added font color [View](https://bitbucket.org/projects/test/repos/my-project/commits/e91c66eef42b7b614458e65cef9dd80660f0a836)
|
||||
* worked on links [View](https://bitbucket.org/projects/test/repos/my-project/commits/f0da02371ddf0a46c3166ec9228a3f7a8e7603b6)
|
||||
* style(hover): added hover color [View](https://bitbucket.org/projects/test/repos/my-project/commits/c3b9ddfb7221c5cba0ab9997fc715096d29df72d)
|
||||
* Modify input's style [View](https://bitbucket.org/projects/test/repos/my-project/commits/7e4feb9350d39880d42505d6a80159d05a49f5f2)
|
||||
* Fix password css object [View](https://bitbucket.org/projects/test/repos/my-project/commits/ecbf7878569c519c41b96001ca2198212f13a5c3)
|
||||
* modifications sur les liens & les buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/435a1d58c90acdd6b373919387558de65bd922c3)
|
||||
* Personalize p html balise [View](https://bitbucket.org/projects/test/repos/my-project/commits/b0ca964c7558c6589aa3cd9d4c4b543a07b9e48c)
|
||||
* added list of elements [View](https://bitbucket.org/projects/test/repos/my-project/commits/8ac8b696aad5bf0358fdd06cbcdc8a6fea718979)
|
||||
* worked a bit on display [View](https://bitbucket.org/projects/test/repos/my-project/commits/93b9908a407999324b50d85619cb185266fbebb0)
|
||||
* worked on home [View](https://bitbucket.org/projects/test/repos/my-project/commits/807b6bc66020c279c4e7296d718579d6837bd671)
|
||||
* added delete buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/c64f6b9ebe17554c500224784417471fb0f93ce5)
|
||||
* added useful classes and comments [View](https://bitbucket.org/projects/test/repos/my-project/commits/58835864d32061c0d1e4c2da8cd00a98561f5b9f)
|
||||
* corrected links background [View](https://bitbucket.org/projects/test/repos/my-project/commits/fcc770f82de0b47a81c8c74cdbd029e82f58005c)
|
||||
* Add img [View](https://bitbucket.org/projects/test/repos/my-project/commits/00e3f00c9adecf6f93d8c3259b7cf71db3fe347a)
|
||||
* select modify [View](https://bitbucket.org/projects/test/repos/my-project/commits/ccf37a85362d9f3a226d0a8e3721702a616ec2c0)
|
||||
* minimal commit [View](https://bitbucket.org/projects/test/repos/my-project/commits/5f796b817a60eee9a7fc609cf00e73959e63209e)
|
||||
* Add dropdown arrow [View](https://bitbucket.org/projects/test/repos/my-project/commits/2e1078c4e437372a8e5705709260cbb76e6264ac)
|
||||
* :zap: format html, :alien: up translate file [View](https://bitbucket.org/projects/test/repos/my-project/commits/320c9504677d521a4011ec4f88c680b1b7177667)
|
||||
* :zap: add pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/018b1ce83eb84a74bafc35bc48fc3404338c384c)
|
||||
* Change colors [View](https://bitbucket.org/projects/test/repos/my-project/commits/9996d954dd5adafd3951e2357ae35fad6f99784e)
|
||||
* Add input borders [View](https://bitbucket.org/projects/test/repos/my-project/commits/1d6f1dc95580fb8432af93290b731c1e107ecea7)
|
||||
* delete left border on textarea [View](https://bitbucket.org/projects/test/repos/my-project/commits/b763252d765360da96f29c827258b76e100be567)
|
||||
* Change png to svg select image [View](https://bitbucket.org/projects/test/repos/my-project/commits/b091a190cf24785e78bce31086ce7f09aa527c64)
|
||||
* change select padding [View](https://bitbucket.org/projects/test/repos/my-project/commits/bddc200cbdc44e0266eaa018c0d9f9a0dff5e8e0)
|
||||
* change select padding [View](https://bitbucket.org/projects/test/repos/my-project/commits/e00dff4acb1a09f759779656af0a80e5d5e72718)
|
||||
* remove placeholder [View](https://bitbucket.org/projects/test/repos/my-project/commits/ba4fad8a31660e5c0a761e7507d9ff7a6f858a0b)
|
||||
* change home order text [View](https://bitbucket.org/projects/test/repos/my-project/commits/48e77024d54edfa950ed1cc89eab4110c830b8ff)
|
||||
* added flex-line [View](https://bitbucket.org/projects/test/repos/my-project/commits/cb6979926d282129cee11c56b352e46a97c58f14)
|
||||
* added wrap to flex-line [View](https://bitbucket.org/projects/test/repos/my-project/commits/ef9a0fe7704a18da5c5b4e75ee0839b53e6e70c3)
|
||||
* changed content width [View](https://bitbucket.org/projects/test/repos/my-project/commits/53a550bdc1ce33f691bffa0cd40a579142dcea05)
|
||||
* Change button style on home [View](https://bitbucket.org/projects/test/repos/my-project/commits/3be3bb44f1886e72a828662d267c090a477a0627)
|
||||
* style answers page [View](https://bitbucket.org/projects/test/repos/my-project/commits/e0898ba3945b8617609bc1a1a24646e27d1713ee)
|
||||
* add button [View](https://bitbucket.org/projects/test/repos/my-project/commits/132a7fabd3c089b84dd237d37c9902996d1f2427)
|
||||
* Testing [View](https://bitbucket.org/projects/test/repos/my-project/commits/df859e02818f2ffe2b2e9340eae725d540fa0e23)
|
||||
* :ambulance: change form-container to home component [View](https://bitbucket.org/projects/test/repos/my-project/commits/d2478c37a48bac56af35d0b91311a99bdd946913)
|
||||
* :zap: all page components do extend basecomponent and its common config service [View](https://bitbucket.org/projects/test/repos/my-project/commits/8f8a258ecf65d8af5307acf5ed8d2b543c835aae)
|
||||
* change link [View](https://bitbucket.org/projects/test/repos/my-project/commits/326f2731ff9caf811cab32062998cc62a6c116b6)
|
||||
* merge with ng-init [View](https://bitbucket.org/projects/test/repos/my-project/commits/193468e66995309adf480db0c6cbbf4113c96bc2)
|
||||
* Remove placeholder [View](https://bitbucket.org/projects/test/repos/my-project/commits/aab6ea801b81ee0aa8368483a2f15070ea574cf9)
|
||||
* :alien: demo for i18n [View](https://bitbucket.org/projects/test/repos/my-project/commits/cc7b4661eefc6674e4e5b849b3b6cda2eb67bbe7)
|
||||
* modify create or retrive page [View](https://bitbucket.org/projects/test/repos/my-project/commits/0c0dd7063dd7a47e1440366dd7b976e3e75e169d)
|
||||
* stylise button [View](https://bitbucket.org/projects/test/repos/my-project/commits/128e4b628185bcb00fe0de15abe2c9277b25f52f)
|
||||
* :alien: add ngx translate config [View](https://bitbucket.org/projects/test/repos/my-project/commits/d1ced70b1b81e2fa7cf8124bc9d6ee9cd76eeae5)
|
||||
* :alien: json strings to translate things in en/fr [View](https://bitbucket.org/projects/test/repos/my-project/commits/90323c28c7e96d1d3c70e54b8818d34680fc5783)
|
||||
* :alien: add missing translation support [View](https://bitbucket.org/projects/test/repos/my-project/commits/91101f2326413f9d63476c026c0207f93cb3e490)
|
||||
* :alien: translate 2 first pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/0f2a72f8720220fd17db37006b5361b425975006)
|
||||
* Add html code for voting [View](https://bitbucket.org/projects/test/repos/my-project/commits/6cc09aebb5f175d09862228799735aeed1ac1c85)
|
||||
* Add css on vote component : No works [View](https://bitbucket.org/projects/test/repos/my-project/commits/e059d45f73b5ee16925260139bdf066a3ac1b4d0)
|
||||
* Minimal commit [View](https://bitbucket.org/projects/test/repos/my-project/commits/9c4fabb176e78f28b72439d6e4f5ee138f404069)
|
||||
* :zap: choice component JS logic and type constraints. demo for dev environment [View](https://bitbucket.org/projects/test/repos/my-project/commits/f48d05b5188df06e3e4494510cb6f780d6b8c982)
|
||||
* :bug: fix undefined choice [View](https://bitbucket.org/projects/test/repos/my-project/commits/1074d219dd9dc5c267976806270dd6a2c51ed4ea)
|
||||
* :zap: date en français dans le choix de vote [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d060f99055acb3d5251b1afde70abc786768f51)
|
||||
* Add round to buttons on vote-choice [View](https://bitbucket.org/projects/test/repos/my-project/commits/1b9c669ae3d16d8fcaaa6977d558e420e7bdfc03)
|
||||
* Corrige center alignement [View](https://bitbucket.org/projects/test/repos/my-project/commits/36192647c01c47f1d6782da6c69297449c1f2d8b)
|
||||
* stylize the date [View](https://bitbucket.org/projects/test/repos/my-project/commits/8215dfab78f101bd15fcfaa0752afedc0b56842d)
|
||||
* Add `npm i` command to README.md [View](https://bitbucket.org/projects/test/repos/my-project/commits/fd27382a9aeaff8a6735a85712d4142f0b795976)
|
||||
* Modify vote component [View](https://bitbucket.org/projects/test/repos/my-project/commits/280783c56b699f72e736f31125cf4ab22c9d8c70)
|
||||
* Translation fr->en [View](https://bitbucket.org/projects/test/repos/my-project/commits/5e2193e8aa0aa5cea1fa1d20127142d84518ede6)
|
||||
* Correction of a typing mistake [View](https://bitbucket.org/projects/test/repos/my-project/commits/a63f76b45014c9dbb199406b30389b447bb09d60)
|
||||
* Put the words in a more natural order [View](https://bitbucket.org/projects/test/repos/my-project/commits/fd6cce277775a271aaab702e836dd93104d7e1be)
|
||||
* Add i18n in navigation [View](https://bitbucket.org/projects/test/repos/my-project/commits/0cb0813eb774c7aff4f96d71822dfa2d9e0cd089)
|
||||
* Stick "Frama" and "date" together [View](https://bitbucket.org/projects/test/repos/my-project/commits/efe0b892186b203dca49939573966eee10d1d772)
|
||||
* Minimal commit [View](https://bitbucket.org/projects/test/repos/my-project/commits/c671a8bdea289d1623502d5672069897556af3ab)
|
||||
* Replaced text by i18n json keys and add i18n attribute [View](https://bitbucket.org/projects/test/repos/my-project/commits/c5021a2aa1ff176457852f5419aa76e58dff2fa6)
|
||||
* Align elements [View](https://bitbucket.org/projects/test/repos/my-project/commits/69802a99ffa5e5a23e94f6b1f1d6931c9bfc62aa)
|
||||
* [front] global : update button styles [View](https://bitbucket.org/projects/test/repos/my-project/commits/802f54b930125db6c8994f53c1389d3892e0b91a)
|
||||
* [front] global : increase main wrap size [View](https://bitbucket.org/projects/test/repos/my-project/commits/a176405dd492ca9941d5b02011436db0e3f2076e)
|
||||
* [front] component : vote choice [View](https://bitbucket.org/projects/test/repos/my-project/commits/3e29117ea62ee3025ed1e3ae8b328aa51197dc3e)
|
||||
* ajout composant graphique sondage [View](https://bitbucket.org/projects/test/repos/my-project/commits/a006e4d42a0bd1bb85361952f47c27aa5ca3307d)
|
||||
* #36 : ajout librairie chartjs [View](https://bitbucket.org/projects/test/repos/my-project/commits/46a02846bfd0a49066cb03fcce04c1f239df5a8a)
|
||||
* issue 36 : select daltonien [View](https://bitbucket.org/projects/test/repos/my-project/commits/5f2a2b4461f6a4b8a33b6d64af4180f7e1ff85de)
|
||||
* Issue-30: Markdown support [View](https://bitbucket.org/projects/test/repos/my-project/commits/be96384a8e5f42211303b5f9215512787e9bb7cd)
|
||||
* [front] component : vote choice [View](https://bitbucket.org/projects/test/repos/my-project/commits/6ee9f742faa27b039785290660563bce998fe52b)
|
||||
* Issue-30 : markdown - bouton retour [View](https://bitbucket.org/projects/test/repos/my-project/commits/ca3b76d0c82dffa5c4f8f4228ef0579da7642500)
|
||||
* Format html templates with tabs [View](https://bitbucket.org/projects/test/repos/my-project/commits/bfa44534aa0ccc821a5d5f73d40a967dbc45ebab)
|
||||
* [fix] vote choice : minor css fixes [View](https://bitbucket.org/projects/test/repos/my-project/commits/28b3334d3e258f3cef1a36c3247aa6f89b37e8a4)
|
||||
* [front] vote choice : add image and text cases [View](https://bitbucket.org/projects/test/repos/my-project/commits/6f8b180d1fdb50f10804025e6232fbe512cf680f)
|
||||
* suppression du code mort [View](https://bitbucket.org/projects/test/repos/my-project/commits/f9a8c1d8c3f92099b2d29723a5337402a0bc6d05)
|
||||
* Resolution du conflit [View](https://bitbucket.org/projects/test/repos/my-project/commits/985be95b0d16529196891d4c855c46bfad53c575)
|
||||
* Conflit resolved [View](https://bitbucket.org/projects/test/repos/my-project/commits/8b728d172f1558f603bc8f11df0d97f737020772)
|
||||
* Traduction placeholder [View](https://bitbucket.org/projects/test/repos/my-project/commits/61d31dfd5a252f7e89ad464c51d675d78b0812d5)
|
||||
* Err correction special dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/22a560d82d40337bd66ab30062ca235a7e3e99ca)
|
||||
* issue-36 : restitution des votes d'un sondage sous forme de graphiques. début [View](https://bitbucket.org/projects/test/repos/my-project/commits/00597410277aa3c387a8b33d9e31033adc853fc9)
|
||||
* :zap: choices to add,clear and delete [View](https://bitbucket.org/projects/test/repos/my-project/commits/b7afca96db4b811fa02e1f4725dc6f5661f1db0e)
|
||||
* Issue-36 : Graph sondage [View](https://bitbucket.org/projects/test/repos/my-project/commits/723a0f9527776f1de653464b979980c662a6e909)
|
||||
* Fix bug [View](https://bitbucket.org/projects/test/repos/my-project/commits/497cf9e12ca5ef283391b9586d83f1ca2daf13dd)
|
||||
* fix bug [View](https://bitbucket.org/projects/test/repos/my-project/commits/1055a0cdbe3f800acccc6a8f06c3669f47ef6de7)
|
||||
* Une partie de html [View](https://bitbucket.org/projects/test/repos/my-project/commits/942649656df42aa23f0117ed8757bb3e176129b8)
|
||||
* :bug: fix focus on date, extend the empty all button to timespans [View](https://bitbucket.org/projects/test/repos/my-project/commits/cf2a12507e053d9235d6a03f1e0569c90df82c27)
|
||||
* Ajout formatage données [View](https://bitbucket.org/projects/test/repos/my-project/commits/c36a3b064cc1330628037c57ffff9cf5c41c183c)
|
||||
* :bug: fix deletions in date buttons , input of type date [View](https://bitbucket.org/projects/test/repos/my-project/commits/933c32798cc26461ca5b62ec3eb89c18f29e4953)
|
||||
* :zap: start call backend service to retrieve my polls by email [View](https://bitbucket.org/projects/test/repos/my-project/commits/026c7cfda2476e7a77cecfaff28c151e835b7a10)
|
||||
* :alien: translate button to add [View](https://bitbucket.org/projects/test/repos/my-project/commits/6a40e041d0af462d9e776632168d033ab2d7eae2)
|
||||
* :alien: translate button to add in template [View](https://bitbucket.org/projects/test/repos/my-project/commits/20876f9a8d927fadc083b193d671355f4bfd3423)
|
||||
* :zap: add unique interval days [View](https://bitbucket.org/projects/test/repos/my-project/commits/572f0837cc93feba5ee76a6b112a14d333ba6121)
|
||||
* :alien: translate buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/7b590840b2a8504db34114434fd2345141711f4d)
|
||||
* :zap: fix function call in template [View](https://bitbucket.org/projects/test/repos/my-project/commits/e81389eae13b8709085710ce60bae6d3307ba7ae)
|
||||
* :zap: link graphic in nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/c0f800ff91822255a4d84e18106d238506dfaab4)
|
||||
* Page crée et bien complétée (plus qu'a faire les alignements) [View](https://bitbucket.org/projects/test/repos/my-project/commits/84b87486ed57d14549f6a5bc5c00df508cad7ed1)
|
||||
* Presque fini [View](https://bitbucket.org/projects/test/repos/my-project/commits/8f8a0d07d27a23f0871f1718ca5e0654bb1f38db)
|
||||
* Dernier commit avant merge [View](https://bitbucket.org/projects/test/repos/my-project/commits/39d4213bded6915081dd42cd506c52ff20ac2659)
|
||||
* Resolve a part of merge conflicts [View](https://bitbucket.org/projects/test/repos/my-project/commits/275a065d8ebde70d9556ad1c2e915daf6228578b)
|
||||
* :zap: svg in assets [View](https://bitbucket.org/projects/test/repos/my-project/commits/d993111d34afa7f33a56c95823e2ca159a8350f1)
|
||||
* :alien: translation keys for visibility page [View](https://bitbucket.org/projects/test/repos/my-project/commits/7a9c7b6dc3d5f63282fe48e8dd9b1979cca38463)
|
||||
* start visibility [View](https://bitbucket.org/projects/test/repos/my-project/commits/8ff8cbc40838ac3ffb41643804ca3aa976adc4c8)
|
||||
* :zap: selector custom component for ui, half the visibility page [View](https://bitbucket.org/projects/test/repos/my-project/commits/d107978f2c66dfa80abb47ddc2cce107f8a5eec1)
|
||||
* end visibilty fields link with poll config [View](https://bitbucket.org/projects/test/repos/my-project/commits/f4108ee61b31fe555775a05dbebba49ed78d722f)
|
||||
* :zap: link default values [View](https://bitbucket.org/projects/test/repos/my-project/commits/c1935dbb87b53b4750c798dee79506cc215ac1dd)
|
||||
* :zap: linked things [View](https://bitbucket.org/projects/test/repos/my-project/commits/7da480f310359c4d29a030654582cbadf68d26ce)
|
||||
* :art: style remove strange section sizes, h1 size greater [View](https://bitbucket.org/projects/test/repos/my-project/commits/93f3aa76bd7aced66d936967c7f7fb90b2d800cd)
|
||||
* add default content to poll config [View](https://bitbucket.org/projects/test/repos/my-project/commits/e179be812eda262fb103c67b721f35f7c95010fa)
|
||||
* :zap: enhance keyboard navigation with answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/9c02b1ae2b16abd5ef43f41721a2657369fedc28)
|
||||
* :alien: add english key to translate [View](https://bitbucket.org/projects/test/repos/my-project/commits/48586b847507e93f0c93c084364523d2bef94e73)
|
||||
* changer la langue entre fr et en quand on clique sur l'icone de traduction [View](https://bitbucket.org/projects/test/repos/my-project/commits/b78ea6273eadfa9ea862952fdd4ed32b72a9191e)
|
||||
* Translation work [View](https://bitbucket.org/projects/test/repos/my-project/commits/abe07bc9784cce5aa93ffa2831ca18abc8e8c046)
|
||||
* HTML Part [View](https://bitbucket.org/projects/test/repos/my-project/commits/c581d7262500778c7fab1d63323f74437a6e0665)
|
||||
* Complete HTML [View](https://bitbucket.org/projects/test/repos/my-project/commits/a53322b441be5cdf882777e92909205e91008445)
|
||||
* CSS Part [View](https://bitbucket.org/projects/test/repos/my-project/commits/3e372d6f53b7dc8e06d26bc8295663505f958def)
|
||||
* Other css part [View](https://bitbucket.org/projects/test/repos/my-project/commits/07f5d60b95e87c5393061a2c443a8d4f3b66e285)
|
||||
* :zap: start backend calls [View](https://bitbucket.org/projects/test/repos/my-project/commits/f223b760fff0cfc769396891f5528fc97b55099d)
|
||||
* organise calls, add headers [View](https://bitbucket.org/projects/test/repos/my-project/commits/cb6636f1557cdf4e33f0a2163245f6ab5ae63755)
|
||||
* push [View](https://bitbucket.org/projects/test/repos/my-project/commits/d3a7a37d4db51e2aaddae9180c7c4d6dc8413444)
|
||||
* Spelling corrections [View](https://bitbucket.org/projects/test/repos/my-project/commits/6f08fc3dd05203babedf7d15c8c9fe09b9b0eca7)
|
||||
* 🎉🎉 Page terminée 🎉🎉 [View](https://bitbucket.org/projects/test/repos/my-project/commits/73b9d496e68db9c0bdb49e1f53fc3a25129c97eb)
|
||||
* Plus qu'a aligner les labels aux inputs [View](https://bitbucket.org/projects/test/repos/my-project/commits/be66cc0a907fc1e947d5c02e85ff1e6388eec0a1)
|
||||
* Terminé [View](https://bitbucket.org/projects/test/repos/my-project/commits/2b079f63a043e3bd2dda486ca8e1005b72535c6a)
|
||||
* Add route and HTML [View](https://bitbucket.org/projects/test/repos/my-project/commits/adcdaf911f99567bb348accd1197a6f013939bca)
|
||||
* Add css [View](https://bitbucket.org/projects/test/repos/my-project/commits/c727aa935e509e061b0dba669e41c82bc6791e63)
|
||||
* :art: style on current page from the route data, and texts in the confirm page, step end [View](https://bitbucket.org/projects/test/repos/my-project/commits/809aa0f02fc0add44b497a4ba8ee55c6ee17fc6c)
|
||||
* :zap: link to public [View](https://bitbucket.org/projects/test/repos/my-project/commits/112119194a1255b6c96e82476dc7e08123b1b835)
|
||||
* :zap: remove debug step in nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/daf7006bb8317b4ec6ed96e0a28ef93d8de9ba39)
|
||||
* :zap: fix some deps [View](https://bitbucket.org/projects/test/repos/my-project/commits/cf4e9f45634b0eb8fa52bf77c52373876ce5eaef)
|
||||
* :zap: update dependencies with yarn, add primefaces to make toasts [View](https://bitbucket.org/projects/test/repos/my-project/commits/ded5e71e73a037096d0497b615faf82d733a775b)
|
||||
* :art: add font awesome [View](https://bitbucket.org/projects/test/repos/my-project/commits/4296c5c9f95c2dae7754c4a6ba1751444b9ff039)
|
||||
* :zap: get poll data in vote choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/5657f57fc75b05c055c63798032c8eae0514a0e0)
|
||||
* :zap: reorganize poll display page [View](https://bitbucket.org/projects/test/repos/my-project/commits/79ef34e5af971db537f42cb0c4eacd6bd79f00e0)
|
||||
* merge with dev [View](https://bitbucket.org/projects/test/repos/my-project/commits/c9b4ffe328ec283b2630406c788dab70b45c8505)
|
||||
* :zap: enhance display poll page [View](https://bitbucket.org/projects/test/repos/my-project/commits/52587428ddcbe179c71892f9288a44202306fb0a)
|
||||
* :zap: reorganize poll display page and urls in config [View](https://bitbucket.org/projects/test/repos/my-project/commits/051e4d8ee469370a7ae7b68cce6a1325394b9c12)
|
||||
* :zap: change translation button way to be in sync with the model [View](https://bitbucket.org/projects/test/repos/my-project/commits/37904596fbc2f68e2fa6d80d44422b4230af71d8)
|
||||
* :art: visual help on clickable elements [View](https://bitbucket.org/projects/test/repos/my-project/commits/5eba5d684b7c8b6194ac1676b4559d189792ec44)
|
||||
* :zap: check for uniqueness of the slug, slug the title by default [View](https://bitbucket.org/projects/test/repos/my-project/commits/2720b6596241874df330373645952f6a53ebeb5c)
|
||||
* :zap: add email to creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/7c64f1f8f08b75fb34ddd7459d8e9580202e5298)
|
||||
* :zap: copy to clipboard ok [View](https://bitbucket.org/projects/test/repos/my-project/commits/4098f7ec5c533d3b35e629278006d6134ff8ee38)
|
||||
* :zap: toast messages when copied to clipboard and network errors [View](https://bitbucket.org/projects/test/repos/my-project/commits/b44f2719b44e4aba7476dc7952b4cc739b9d1d39)
|
||||
* :book: clean console logs [View](https://bitbucket.org/projects/test/repos/my-project/commits/7df60e5a514783a5d393e9a3446a934e12e580ea)
|
||||
* :bug: fix show and hide of password input [View](https://bitbucket.org/projects/test/repos/my-project/commits/fd4bbb5c712fb79204badae316d92fd17be7c9e5)
|
||||
* :zap: calls in administration page to delete things [View](https://bitbucket.org/projects/test/repos/my-project/commits/bae3f19af223022c933fd622d3c8adf2bf6167db)
|
||||
* :bug: remove duplicate text in end of admin page [View](https://bitbucket.org/projects/test/repos/my-project/commits/113609e945f5e09ae3c04119225eb6bd7fa670c8)
|
||||
* :zap: toast todo things [View](https://bitbucket.org/projects/test/repos/my-project/commits/7b790e3cdc58ee296e16645abef0fc9ee0cad629)
|
||||
* :zap: computations for the result graph [View](https://bitbucket.org/projects/test/repos/my-project/commits/1b65d58a6f52acfb0265c33de7c9779177b73ff1)
|
||||
* toggle simple answer [View](https://bitbucket.org/projects/test/repos/my-project/commits/a3e243ed19bddc12e194a166ab38c3101835fcc2)
|
||||
* :bug: fix build [View](https://bitbucket.org/projects/test/repos/my-project/commits/10497c9cb09873f3ede8b75729d2f444d12e5338)
|
||||
* :zap: add update demo script, remove duplicate toast, try hash route [View](https://bitbucket.org/projects/test/repos/my-project/commits/6a3d2c3195303b5094f43102df78f7e4990e19c8)
|
||||
* :zap: modal to display url [View](https://bitbucket.org/projects/test/repos/my-project/commits/255205696bcf8778088404348bdd0b748649f0b3)
|
||||
* :zap: list mypolls on first page [View](https://bitbucket.org/projects/test/repos/my-project/commits/9ebd22536b1ed314e264757867d84bef1ee87d9f)
|
||||
* buttons to nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/3808f194258dd5cd93b03258ec2f2d90ee6b615b)
|
||||
* :zap: erasable inputs on first config screen ok [View](https://bitbucket.org/projects/test/repos/my-project/commits/3ada66ac5f36c38502556f18982954d2526cce0e)
|
||||
* launch creation from resume page [View](https://bitbucket.org/projects/test/repos/my-project/commits/f8568eb9102668521556b40eacc89ee8b639db09)
|
||||
* :zap: lang input placement [View](https://bitbucket.org/projects/test/repos/my-project/commits/ff5c11e79c42926296516f27cc95aa660e34a50d)
|
||||
* :zap: really fetch a poll by id [View](https://bitbucket.org/projects/test/repos/my-project/commits/123a0b1c809999306f131e6e0f9523d82944d38a)
|
||||
* :zap: update vote list after vote creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/06cf447529583f05789e17f9d9b9d196f0a56409)
|
||||
* :zap: hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/96709c9bc71980541497eb7f4387512948f3de08)
|
||||
* :book: add mocks from updated backend [View](https://bitbucket.org/projects/test/repos/my-project/commits/a68cbdcc0a017e30490239ff9593c69b7b2f798f)
|
||||
* :bug: fix recursion in input erase button [View](https://bitbucket.org/projects/test/repos/my-project/commits/195259bb722a4dd5260a05bbe5dd77cbc6d0577e)
|
||||
* :zap: menu to nav on poll display - #64 [View](https://bitbucket.org/projects/test/repos/my-project/commits/d2c726012bbc4cf413b18f454fc9e859fdb50b49)
|
||||
* :zap: build for production, :bug: fix publicy of vars in templates [View](https://bitbucket.org/projects/test/repos/my-project/commits/ea43430e1b7acf3f6250215fc9966cca5e6422a5)
|
||||
* :zap: build for demo updated [View](https://bitbucket.org/projects/test/repos/my-project/commits/f96833d96e7c53dd855113ef9e3a7dd7b62c5021)
|
||||
* :zap: use hash for internal routing in the frontend [View](https://bitbucket.org/projects/test/repos/my-project/commits/b06a44fb98ec9d0f3903b99f917aff7817742983)
|
||||
* poll routing hints in the app, demo precision in header [View](https://bitbucket.org/projects/test/repos/my-project/commits/8322a9a83a799e67b90dd47e0aa4ff1c56b81e0b)
|
||||
* :zap: other url to create a poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/9900e1ec976dd98fcb63bc35ed6f286caa8c427c)
|
||||
* sync fetch stuff [View](https://bitbucket.org/projects/test/repos/my-project/commits/02995c8b3d40eb7b05361c8ecf9e59a706a0fd51)
|
||||
* :zap: mock for poll 1, fix new comment [View](https://bitbucket.org/projects/test/repos/my-project/commits/346bd9dc4f69296c51550f0da1b7e40a632051a7)
|
||||
* stuff [View](https://bitbucket.org/projects/test/repos/my-project/commits/7e4e80f1ed3843eb8724e93d46c1d7fc598dcdd1)
|
||||
* :bug: fix fetch of old params [View](https://bitbucket.org/projects/test/repos/my-project/commits/01bddc842db7b91ed2e5ebe4db036ba709dae3f4)
|
||||
* :zap: add administration key after creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/7bc53e198d8dc9fdae172bd596647a6b2ca1ad6f)
|
||||
* :zap: choices lighter and work [View](https://bitbucket.org/projects/test/repos/my-project/commits/22bd836a16187607ee3be22cad867c7f7e2e729b)
|
||||
* step to date form [View](https://bitbucket.org/projects/test/repos/my-project/commits/2e6723a1f1121c47bf9e6fb00cc043f987394940)
|
||||
* fix buttons colours and manage a bit more the date form [View](https://bitbucket.org/projects/test/repos/my-project/commits/f056b0d79a2a5c894cc91d3723d16244c4abb58d)
|
||||
* button to act on time [View](https://bitbucket.org/projects/test/repos/my-project/commits/a66933041f46dbaa2a15d373fd1809c82607dff3)
|
||||
* change preview for dates type [View](https://bitbucket.org/projects/test/repos/my-project/commits/460e236d604beb1c24b4beaa5a1d992eb5b45dab)
|
||||
* date accessor [View](https://bitbucket.org/projects/test/repos/my-project/commits/22736f709e36463e9e470e9a3385d246c85fd85f)
|
||||
* :bug: handle no current poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/f9d1cfff3a8f0f8d17ce622f21bc74fa9aa66aac)
|
||||
* :bug: fix some config keys [View](https://bitbucket.org/projects/test/repos/my-project/commits/100569515328df6988c250f87e12124e9034227e)
|
||||
* :zap: manage interval of date with date objects [View](https://bitbucket.org/projects/test/repos/my-project/commits/e227344647501e02bb3ed56da2e239e5c9e2a06a)
|
||||
* :zap: disabled button when nothing is selected, detect counts [View](https://bitbucket.org/projects/test/repos/my-project/commits/0369d934bddc852e71d7a671ec41765b1a80990c)
|
||||
* display a table of answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/43ea524c2604891095940da3827ecd7c0003a10b)
|
||||
* :bug: fix visibility of config in summary [View](https://bitbucket.org/projects/test/repos/my-project/commits/f976d65d204183c3c9f5d1d606edcf97bf6db311)
|
||||
* :zap: update current answers with a previous vote [View](https://bitbucket.org/projects/test/repos/my-project/commits/9cf368f5504c1dcd28d34f9682888c65202bda6f)
|
||||
* sort table of answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/ca69160ea979c2995a2e5cdc2b825bb05e293fa2)
|
||||
* :zap: show preferred texts in summary, icons for votes [View](https://bitbucket.org/projects/test/repos/my-project/commits/0e8d18cd8000b2b9a9fb3d74277bf24a26c8b380)
|
||||
* :zap: add bulma framework, style table [View](https://bitbucket.org/projects/test/repos/my-project/commits/74ade7ac0fe52d48bec50522b648b5e0bac27d1e)
|
||||
* fix select visibility [View](https://bitbucket.org/projects/test/repos/my-project/commits/bc67f26327186ef6ff9a476824eae987f3b83532)
|
||||
* :zap: component to copy text to clipboard [View](https://bitbucket.org/projects/test/repos/my-project/commits/63e1a5e899cd6681ce819c53669a76b7987fb7a2)
|
||||
* :zap: unify update config after fetching a poll config [View](https://bitbucket.org/projects/test/repos/my-project/commits/dd9e8950f4473dd39841ba3150bff23b8f172016)
|
||||
* :fix: load vote of someone else ok [View](https://bitbucket.org/projects/test/repos/my-project/commits/b1adfaa8ea565cc6204ef975d5153ba99fc66e75)
|
||||
* :zap: reset all answers before loading a stack [View](https://bitbucket.org/projects/test/repos/my-project/commits/4bcd3e475f9c7f31b5b4f8f5ffe700239929660c)
|
||||
* export data in csv with rows and comments [View](https://bitbucket.org/projects/test/repos/my-project/commits/e3e5cf6638b2522c2bc7ac7181d63a6f3683e502)
|
||||
* :zap: split poll display components [View](https://bitbucket.org/projects/test/repos/my-project/commits/ab23b9b2566cbd328bf9a510202c39fcd046634c)
|
||||
* :gears: refacto date and poll utilities functions in a separate class [View](https://bitbucket.org/projects/test/repos/my-project/commits/c5b52764002149eff41dcd48cb876fa6ec79d562)
|
||||
* :book: update refacto utilities as services [View](https://bitbucket.org/projects/test/repos/my-project/commits/44424d378aef95bb0bfc014104b5346c340ad5c7)
|
||||
* :hammer: test voting choice, add ci pipeline config [View](https://bitbucket.org/projects/test/repos/my-project/commits/0a3ee9b6f0c145ed069eb07f554f20f4f294cff4)
|
||||
* :zap: update package lock for CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/91b1d64f0a6282fcbebd46aab328988e75be2620)
|
||||
* :bug: run test in single run mode on CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/a088daf4a3a1870a82c300e66d1463b0be909f5e)
|
||||
* run build for prod on CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/b360720e1504af9b220d579ee2b01668255c6b7d)
|
||||
* :gears: update ng cli 8 [View](https://bitbucket.org/projects/test/repos/my-project/commits/8f59e654477a5b2ccea0748b59720ccb8137919e)
|
||||
* :hammer: update to angular v 9 [View](https://bitbucket.org/projects/test/repos/my-project/commits/38d1d52633a3e0fb8d68433edb985754861aaf2b)
|
||||
* :zap: custom date value accessor with renderer 2 [View](https://bitbucket.org/projects/test/repos/my-project/commits/1816150c6d06c51ab83cc77ebebff7ff70cc002f)
|
||||
* :hammer: test with FirefoxHeadless for gitlab CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/e089d19993613619c0585556f5cdc6265154a0cb)
|
||||
* :zap: manage dates poll type display, fix typo in add button date [View](https://bitbucket.org/projects/test/repos/my-project/commits/15bbf0e375309a8e273c4a5b9aa0bc70cd5cdc6e)
|
||||
* dates and recap side to side [View](https://bitbucket.org/projects/test/repos/my-project/commits/61bf6a289c44cac419d60e186f18594b21f1b4e8)
|
||||
* :zap: ad storybook [View](https://bitbucket.org/projects/test/repos/my-project/commits/4ec9b174ad295f5cee76e515ed70b88313f6476e)
|
||||
* :zap: add some types interfaces in the config [View](https://bitbucket.org/projects/test/repos/my-project/commits/49b79395644d792ac633a0df5d15da07e0c460a3)
|
||||
* :book: add compodoc [View](https://bitbucket.org/projects/test/repos/my-project/commits/d7a2a8d6b78f7ea920fd794139f7f3d0d6dddd51)
|
||||
* :bug: fix synced time slices [View](https://bitbucket.org/projects/test/repos/my-project/commits/ff8e02b2154d81a62a7f979dcfcc83c826a79295)
|
||||
* :fix: remove puckage lock in profit of yarn [View](https://bitbucket.org/projects/test/repos/my-project/commits/ba7465fe8395c26e0d2bb6ae8fcab10d179a2497)
|
||||
* :bug: add package only for CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/e03359e8db170647a5534e376803a9d6e0a10ddd)
|
||||
* :zap: component to select theme [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d757c6726a942237c3bad27258e1820bce1e5d0)
|
||||
* :art: better disposal for theme selector [View](https://bitbucket.org/projects/test/repos/my-project/commits/312b2d859943900a8784d0fbdc1cc03db0ab2be4)
|
||||
* :hammer: fix for CI, bad option in npm run test [View](https://bitbucket.org/projects/test/repos/my-project/commits/a0138f84d3b01e276909a934d176a375e22529b1)
|
||||
* :zap: add confirmation modal for admin user, issue #59 [View](https://bitbucket.org/projects/test/repos/my-project/commits/c0a4ec7a0c143263ed84b494ca30fcce3dc27e00)
|
||||
* :bug: fix update after vote #65 [View](https://bitbucket.org/projects/test/repos/my-project/commits/75c26572fe0fcc9b305c51d10a39bd1d3fba6f43)
|
||||
* :zap: can or can not modify votes issue #49 [View](https://bitbucket.org/projects/test/repos/my-project/commits/fff4e57378d9a49211a684f64433870fd67b3441)
|
||||
* :zap: fix issue of selecting can or can not modify answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/23dc45f1986fd8b3c06af7ba02a192737c04c3a4)
|
||||
* :art: arrange create or retrieve page in two columns [View](https://bitbucket.org/projects/test/repos/my-project/commits/60c184c60ba389e8ebd1b40d6ac0d51488fe66b6)
|
||||
* split many components, presentation with left nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/9bdd4e0084d8c4fedf45453b947348cf55ad7416)
|
||||
* :hammer: fix linting, add env default [View](https://bitbucket.org/projects/test/repos/my-project/commits/6e6b812d2d5271221d65b7d3d8c2705e134e2683)
|
||||
* :zap: theme persisted in the localstorage, reload config on page reload - issue #75 [View](https://bitbucket.org/projects/test/repos/my-project/commits/936110846c4326d5772c89fbfad488b44aaa7651)
|
||||
* :zap: :alien: Conserver le choix de langue au rechargement de la page - issue #54 [View](https://bitbucket.org/projects/test/repos/my-project/commits/acb091802c51ee7d1fad0b0ae08597da87cf3c52)
|
||||
* :zap: export format json public [View](https://bitbucket.org/projects/test/repos/my-project/commits/e2c388da9e26e908ca278cde575ac9bff28926e4)
|
||||
* :zap: add eslint [View](https://bitbucket.org/projects/test/repos/my-project/commits/e56d5cdcef59bba41e0d37711f047b6f799e45fa)
|
||||
* - upgrade all packages - intall & configure linters (eslint, prettier, etc.) [View](https://bitbucket.org/projects/test/repos/my-project/commits/dd9bb8922f24cca7b33c34cb3bad1b190aebb91a)
|
||||
* reformat all files + move routes.ts to AppRoutingModule [View](https://bitbucket.org/projects/test/repos/my-project/commits/18a7d4781ac44f820b870269f5134b305758e722)
|
||||
* Jest tests [View](https://bitbucket.org/projects/test/repos/my-project/commits/ca5ffdc896864d47467b7562494c600b120f4d2b)
|
||||
* routing for admin ith token parameter, add comments [View](https://bitbucket.org/projects/test/repos/my-project/commits/15b10f938149cc5fb8af087f773188be3c722bfe)
|
||||
* :zap: admin route calling the backend [View](https://bitbucket.org/projects/test/repos/my-project/commits/8fa39250d5e5863c8987b3fc2e9464dc3bb61d7e)
|
||||
* refacto : create entities, enums, services [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5243204572e2dcba735335f4861f36d72fd98a5)
|
||||
* :gears: move components to better semantic folders [View](https://bitbucket.org/projects/test/repos/my-project/commits/86ada008c505f6935e540023bb706cf9605588d9)
|
||||
* :zap: change theme enum to correspond with themes classnames [View](https://bitbucket.org/projects/test/repos/my-project/commits/60b4bfb6197318ca5bb6e21d8dfc031da7c5d070)
|
||||
* :zap: add component having a couple of configurable links, to navigate between pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/da7e96526c3ed95b395b33bdaee5347ea9837f6f)
|
||||
* Feature/simplify scss [View](https://bitbucket.org/projects/test/repos/my-project/commits/ba7a24708dd83cc99c81ebe064f5570fac369a38)
|
||||
* gitignore add eslintcache file [View](https://bitbucket.org/projects/test/repos/my-project/commits/985b9fcdcf17b35790e341318b1a109b3e454a79)
|
||||
* update env api endpoints [View](https://bitbucket.org/projects/test/repos/my-project/commits/23b8622a4f2b8d74e1b2d80319658ac70bcd2e21)
|
||||
* rebase branch 'feature/refacto_1' of https://framagit.org/framasoft/framadate/funky-framadate-front into feature/refacto_1 [View](https://bitbucket.org/projects/test/repos/my-project/commits/7a4f16e4845f74894bcbfd7344205f005c243b5e)
|
||||
* :bug: remove admin component request [View](https://bitbucket.org/projects/test/repos/my-project/commits/4ec9091233986af49d5c271b91bdbe33b18aaebe)
|
||||
* :bug: fix window variable in html [View](https://bitbucket.org/projects/test/repos/my-project/commits/48636ad9478e002da705bd96c330333cb3bb3fc9)
|
||||
* split config service & dispatch [View](https://bitbucket.org/projects/test/repos/my-project/commits/3997dd090e076bcd3f92562e231f118eb5cc731f)
|
||||
* upgrade archi with modules [View](https://bitbucket.org/projects/test/repos/my-project/commits/7029368ab1fc7f4ebbddcaca3d7140f4441d2873)
|
||||
* - replace date-fns by momentJS - install ng2-chart along with chart.js [View](https://bitbucket.org/projects/test/repos/my-project/commits/91be2a3048dbaa0179fa97f8cbc027d06b276f4a)
|
||||
* 👷 — Build and deploy on Gitlab pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/f6753822183d63a53c908017740b0908a600f3cc)
|
||||
* 👷 — Try to deploy build on Gitlab page even if test fails [View](https://bitbucket.org/projects/test/repos/my-project/commits/f1cbf175a9c93681ffa0e438564cc76925e3c87a)
|
||||
* 👷 — Deploy build on Gitlab page before tests [View](https://bitbucket.org/projects/test/repos/my-project/commits/96354f6202c0de8892a7516658ea1a5e65a28615)
|
||||
* 👷 — Modify <base> tag in build’s index.html [View](https://bitbucket.org/projects/test/repos/my-project/commits/da854454aaee8390e9430def4674577b747433cb)
|
||||
* 👷 — Cleaner script for Gitlab page build [View](https://bitbucket.org/projects/test/repos/my-project/commits/645b25de790b43c19191545beecd4923a29b71eb)
|
||||
* [feat] :zap: add a floating button to give feedback [View](https://bitbucket.org/projects/test/repos/my-project/commits/442530983b8015a291ae34be78d78c9e061adf7d)
|
||||
* :style: style for feedback options, fixed floating button [View](https://bitbucket.org/projects/test/repos/my-project/commits/9057e890a408199eb96b6a6b7a92336a4b31582c)
|
||||
* default to hide menu [View](https://bitbucket.org/projects/test/repos/my-project/commits/93ea16127475cd7611b70684ea6ff2f6d90ce96e)
|
||||
* :zap: refacto feedback, :art: style for popup links, place icons before text [View](https://bitbucket.org/projects/test/repos/my-project/commits/cc27f31e0ecf08c5cae26068d19e1e715e921844)
|
||||
* :zap: styling themes [View](https://bitbucket.org/projects/test/repos/my-project/commits/23c6b9400ee2d2917e3f5e8cf3d327fd2a537747)
|
||||
* :book: add footer links, :art: set default theme to light, fix some details with black theme. [View](https://bitbucket.org/projects/test/repos/my-project/commits/a93a34a638ecca03dfc6466f0b347c9961cff18f)
|
||||
* :art: primary button, section to find back my polls on home [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2a739016fbc39b69138127fe60de621698aa904)
|
||||
* add feedback button, load administration module from app module [View](https://bitbucket.org/projects/test/repos/my-project/commits/9c60f8a379fffea4574c86799c886aee37dd9968)
|
||||
* :zap: change branch name in update demo script [View](https://bitbucket.org/projects/test/repos/my-project/commits/a1de41699e4aeeb6149f2a93f8c98696ff952a40)
|
||||
* :zap: demo build script back to life [View](https://bitbucket.org/projects/test/repos/my-project/commits/4f0a29e806f9a87b97c7024487b195b3c90896eb)
|
||||
* add user settings button & modal [View](https://bitbucket.org/projects/test/repos/my-project/commits/355fed53f3dc45fc27245e5b13dcefadac774b87)
|
||||
* add json-server + refacto [View](https://bitbucket.org/projects/test/repos/my-project/commits/ae2974967048a6bbbba65df79591a1dcff970064)
|
||||
* clean refacto [View](https://bitbucket.org/projects/test/repos/my-project/commits/3125e86f0bdc1ab74cec9baeb273588afe92ca90)
|
||||
* replace primeng by material && improvments [View](https://bitbucket.org/projects/test/repos/my-project/commits/f9b847b305192506b2fc8109f187f6a45afeccd3)
|
||||
* add route resolver for lazy-loading [View](https://bitbucket.org/projects/test/repos/my-project/commits/63600c759ebbdba5473789b6b030fe8e33a767ae)
|
||||
* refacto routing [View](https://bitbucket.org/projects/test/repos/my-project/commits/a62e00c6adf4a0a62a617e0e5a9a054b6bfd6803)
|
||||
|
||||
|
||||
# Changelog
|
||||
|
660
LICENSE.md
@ -1,660 +0,0 @@
|
||||
### GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
<https://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
### Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains
|
||||
free software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing
|
||||
under this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
### TERMS AND CONDITIONS
|
||||
|
||||
#### 0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds
|
||||
of works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of
|
||||
an exact copy. The resulting work is called a "modified version" of
|
||||
the earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user
|
||||
through a computer network, with no transfer of a copy, is not
|
||||
conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices" to
|
||||
the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
#### 1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work for
|
||||
making modifications to it. "Object code" means any non-source form of
|
||||
a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users can
|
||||
regenerate automatically from other parts of the Corresponding Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that same
|
||||
work.
|
||||
|
||||
#### 2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not convey,
|
||||
without conditions so long as your license otherwise remains in force.
|
||||
You may convey covered works to others for the sole purpose of having
|
||||
them make modifications exclusively for you, or provide you with
|
||||
facilities for running those works, provided that you comply with the
|
||||
terms of this License in conveying all material for which you do not
|
||||
control copyright. Those thus making or running the covered works for
|
||||
you must do so exclusively on your behalf, under your direction and
|
||||
control, on terms that prohibit them from making any copies of your
|
||||
copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under the
|
||||
conditions stated below. Sublicensing is not allowed; section 10 makes
|
||||
it unnecessary.
|
||||
|
||||
#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such
|
||||
circumvention is effected by exercising rights under this License with
|
||||
respect to the covered work, and you disclaim any intention to limit
|
||||
operation or modification of the work as a means of enforcing, against
|
||||
the work's users, your or third parties' legal rights to forbid
|
||||
circumvention of technological measures.
|
||||
|
||||
#### 4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
#### 5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these
|
||||
conditions:
|
||||
|
||||
- a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
- b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under
|
||||
section 7. This requirement modifies the requirement in section 4
|
||||
to "keep intact all notices".
|
||||
- c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
- d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
#### 6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms of
|
||||
sections 4 and 5, provided that you also convey the machine-readable
|
||||
Corresponding Source under the terms of this License, in one of these
|
||||
ways:
|
||||
|
||||
- a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
- b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the Corresponding
|
||||
Source from a network server at no charge.
|
||||
- c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
- d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
- e) Convey the object code using peer-to-peer transmission,
|
||||
provided you inform other peers where the object code and
|
||||
Corresponding Source of the work are being offered to the general
|
||||
public at no charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal,
|
||||
family, or household purposes, or (2) anything designed or sold for
|
||||
incorporation into a dwelling. In determining whether a product is a
|
||||
consumer product, doubtful cases shall be resolved in favor of
|
||||
coverage. For a particular product received by a particular user,
|
||||
"normally used" refers to a typical or common use of that class of
|
||||
product, regardless of the status of the particular user or of the way
|
||||
in which the particular user actually uses, or expects or is expected
|
||||
to use, the product. A product is a consumer product regardless of
|
||||
whether the product has substantial commercial, industrial or
|
||||
non-consumer uses, unless such uses represent the only significant
|
||||
mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to
|
||||
install and execute modified versions of a covered work in that User
|
||||
Product from a modified version of its Corresponding Source. The
|
||||
information must suffice to ensure that the continued functioning of
|
||||
the modified object code is in no case prevented or interfered with
|
||||
solely because modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or
|
||||
updates for a work that has been modified or installed by the
|
||||
recipient, or for the User Product in which it has been modified or
|
||||
installed. Access to a network may be denied when the modification
|
||||
itself materially and adversely affects the operation of the network
|
||||
or violates the rules and protocols for communication across the
|
||||
network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
#### 7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders
|
||||
of that material) supplement the terms of this License with terms:
|
||||
|
||||
- a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
- b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
- c) Prohibiting misrepresentation of the origin of that material,
|
||||
or requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
- d) Limiting the use for publicity purposes of names of licensors
|
||||
or authors of the material; or
|
||||
- e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
- f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions
|
||||
of it) with contractual assumptions of liability to the recipient,
|
||||
for any liability that these contractual assumptions directly
|
||||
impose on those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions; the
|
||||
above requirements apply either way.
|
||||
|
||||
#### 8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your license
|
||||
from a particular copyright holder is reinstated (a) provisionally,
|
||||
unless and until the copyright holder explicitly and finally
|
||||
terminates your license, and (b) permanently, if the copyright holder
|
||||
fails to notify you of the violation by some reasonable means prior to
|
||||
60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
#### 9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or run
|
||||
a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
#### 10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
#### 11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims owned
|
||||
or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within the
|
||||
scope of its coverage, prohibits the exercise of, or is conditioned on
|
||||
the non-exercise of one or more of the rights that are specifically
|
||||
granted under this License. You may not convey a covered work if you
|
||||
are a party to an arrangement with a third party that is in the
|
||||
business of distributing software, under which you make payment to the
|
||||
third party based on the extent of your activity of conveying the
|
||||
work, and under which the third party grants, to any of the parties
|
||||
who would receive the covered work from you, a discriminatory patent
|
||||
license (a) in connection with copies of the covered work conveyed by
|
||||
you (or copies made from those copies), or (b) primarily for and in
|
||||
connection with specific products or compilations that contain the
|
||||
covered work, unless you entered into that arrangement, or that patent
|
||||
license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
#### 12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under
|
||||
this License and any other pertinent obligations, then as a
|
||||
consequence you may not convey it at all. For example, if you agree to
|
||||
terms that obligate you to collect a royalty for further conveying
|
||||
from those to whom you convey the Program, the only way you could
|
||||
satisfy both those terms and this License would be to refrain entirely
|
||||
from conveying the Program.
|
||||
|
||||
#### 13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your
|
||||
version supports such interaction) an opportunity to receive the
|
||||
Corresponding Source of your version by providing access to the
|
||||
Corresponding Source from a network server at no charge, through some
|
||||
standard or customary means of facilitating copying of software. This
|
||||
Corresponding Source shall include the Corresponding Source for any
|
||||
work covered by version 3 of the GNU General Public License that is
|
||||
incorporated pursuant to the following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
#### 14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Affero General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever
|
||||
published by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future versions
|
||||
of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
#### 15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
|
||||
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
|
||||
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
|
||||
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
|
||||
CORRECTION.
|
||||
|
||||
#### 16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
|
||||
CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
|
||||
NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
|
||||
LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
|
||||
TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
|
||||
PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
#### 17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
### How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these
|
||||
terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to
|
||||
attach them to the start of each source file to most effectively state
|
||||
the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper
|
||||
mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for
|
||||
the specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. For more information on this, and how to apply and follow
|
||||
the GNU AGPL, see <https://www.gnu.org/licenses/>.
|
76
README.md
@ -1,60 +1,42 @@
|
||||
# Framadate - funky version
|
||||
![landing_page](docs/img/landing_page.png)
|
||||
<a href="https://weblate.framasoft.org/engage/funky-framadate/">
|
||||
<img src="https://weblate.framasoft.org/widgets/funky-framadate/-/funky-framadate-front/multi-auto.svg" alt="État de la traduction" />
|
||||
</a>
|
||||
|
||||
<a href="https://weblate.framasoft.org/engage/funky-framadate/">
|
||||
<img src="https://weblate.framasoft.org/widgets/funky-framadate/-/funky-framadate-front/open-graph.png" alt="État de la traduction" />
|
||||
</a>
|
||||
|
||||
FR: Un logiciel libre de sondage fait par les contributeurs de l'association Framasoft, avec une API backend.
|
||||
|
||||
EN: A libre polling software made by contributors around the French association Framasoft.
|
||||
This version uses a brand new backend API.
|
||||
***
|
||||
> l'API de backend est en PHP / Symfony, ses sources disponible sur framagit
|
||||
https://framagit.org/tykayn/date-poll-api
|
||||
***
|
||||
|
||||
## Pour débuter - getting started
|
||||
[lire la doc pour débuter votre Funky Framadate](docs/GETTING_STARTED.md)
|
||||
|
||||
## Design et maquettes
|
||||
Maquette naviguable: https://www.figma.com/file/Q3I15MEuOtTwL0WIQ2eSMu/%F0%9F%93%85-Framadate?node-id=0%3A6510
|
||||
|
||||
[lire la doc pour débuter votre Funky Framadate](doc/GETTING_STARTED.md)
|
||||
|
||||
## Documentation
|
||||
FR: Toute la documentation est disponible [dans le dossier "doc"](/docs), principalement en Français.
|
||||
FR: Toute la documentation est disponible [dans le dossier "doc"](/doc), principalement en Français.
|
||||
EN: All documentation is available in the "doc" folder, mainly in French because reasons.
|
||||
|
||||
* Meeting notes
|
||||
* Getting Started (yarn start / npm start)
|
||||
* How to contribute
|
||||
* Architecture
|
||||
* Translation i18n
|
||||
* Accesibility
|
||||
* Licence GNU affero V3
|
||||
|
||||
# Version funky framadate
|
||||
|
||||
* Selon les maquettes par Thomas Bonamy : https://www.figma.com/file/Q3I15MEuOtTwL0WIQ2eSMu
|
||||
* icones https://feathericons.com/
|
||||
|
||||
* [Spécifications](docs/cadrage/specifications-fonctionnelles)
|
||||
* maquettes par @maiwann : https://scene.zeplin.io/project/5d4d83d68866d6522ff2ff10
|
||||
* vidéo de démo des maquettes par @maiwann : https://nuage.maiwann.net/s/JRRHTR9D2akMAa7
|
||||
* discussions sur framateam canal général : https://framateam.org/ux-framatrucs/channaels/framadate
|
||||
* discussions techniques côté développeurs : https://framateam.org/ux-framatrucs/channels/framadate-dev
|
||||
* [notes de réunion](docs/reunions)
|
||||
* [traductions](docs/traductions)
|
||||
* [notes de réunion](notes-de-reunion)
|
||||
* [traductions](traductions)
|
||||
|
||||
|
||||
## Screenshots - exemples de maquette de la nouvelle version
|
||||
![funky_framadate_maquette](docs/img/Screenshot_2021-04-19%20migration%20depuis%20un%20Framadate%20version%201.jpeg)
|
||||
![funky_framadate_maquette](docs/img/advanced_config.png)
|
||||
![funky_framadate_maquette](docs/img/preview_creation.png)
|
||||
![funky_framadate_maquette](docs/img/kind_poll.png)
|
||||
![funky_framadate_maquette](docs/img/colors_framadate_funky.png)
|
||||
![funky_framadate_maquette](docs/img/framdate_funky_design.png)
|
||||
|
||||
# Documentations sur Angular
|
||||
|
||||
* `{- sur sass -}` (on va utiliser CSS, si angular permet d'avoir des variables CSS, @newick)
|
||||
|
||||
|
||||
# Exemple de maquette de la nouvelle version
|
||||
|
||||
![funky_framadate_maquette](uploads/535da7c3a5ce5fae67b2b497bdc4631d/funky_framadate_maquette.png)
|
||||
|
||||
## LIBRARIES USED
|
||||
|
||||
| status | lib choice_label | usage |
|
||||
@ -83,4 +65,28 @@ EN: All documentation is available in the "doc" folder, mainly in French because
|
||||
| to be removed | [uuid](https://www.npmjs.com/package/uuid) | generate uuid |
|
||||
|
||||
---
|
||||
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.
|
||||
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.1.
|
||||
# Framadate
|
||||
|
||||
|
||||
## Code scaffolding
|
||||
|
||||
Run `ng generate component component-choice_label` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
|
||||
|
||||
## Build
|
||||
|
||||
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
|
||||
|
||||
## Running unit tests
|
||||
|
||||
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
||||
|
||||
## Running end-to-end tests
|
||||
|
||||
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
|
||||
|
||||
## Further help
|
||||
|
||||
Before using ng for the first time in this project, use `npm i` to install needed npm modules.
|
||||
|
||||
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
|
||||
|
@ -1,3 +0,0 @@
|
||||
# Résumé de Changelog
|
||||
|
||||
Le détail se trouve dans [CHANGELOG.md]()
|
23
angular.json
@ -22,16 +22,12 @@
|
||||
"main": "src/main.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"assets": [
|
||||
"src/favicon.ico",
|
||||
"src/assets"
|
||||
],
|
||||
"assets": ["src/favicon.ico", "src/assets"],
|
||||
"styles": [
|
||||
"node_modules/fork-awesome/css/fork-awesome.min.css",
|
||||
"node_modules/bulma-switch/dist/css/bulma-switch.min.css",
|
||||
"node_modules/primeicons/primeicons.css",
|
||||
"node_modules/primeng/resources/themes/saga-blue/theme.css",
|
||||
"node_modules/primeng/resources/themes/nova-light/theme.css",
|
||||
"node_modules/primeng/resources/primeng.min.css",
|
||||
"node_modules/bulma-switch/dist/css/bulma-switch.min.css",
|
||||
"src/styles.scss"
|
||||
],
|
||||
"scripts": [
|
||||
@ -77,7 +73,8 @@
|
||||
"serve": {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"options": {
|
||||
"browserTarget": "framadate:build"
|
||||
"browserTarget": "framadate:build",
|
||||
"proxyConfig": "src/proxy.conf.json"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
@ -98,14 +95,8 @@
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"tsconfig.app.json",
|
||||
"tsconfig.spec.json",
|
||||
"e2e/tsconfig.json"
|
||||
],
|
||||
"exclude": [
|
||||
"**/node_modules/**"
|
||||
]
|
||||
"tsConfig": ["tsconfig.app.json", "tsconfig.spec.json", "e2e/tsconfig.json"],
|
||||
"exclude": ["**/node_modules/**"]
|
||||
}
|
||||
},
|
||||
"e2e": {
|
||||
|
@ -1,11 +1,11 @@
|
||||
# Comment contribuer à Framadate funky ?
|
||||
Il existe des tas de façons de contribuer à un logiciel libre comme Framadate. Vous pouvez __discuter__ avec d'autres personnes de ce que vous souhaiteriez voir naître dans le logiciel, __essayer__ de l'utiliser dans sa version expérimentale, __mettre en place une démo__ ou un service publiquement utilisable, __écrire__ des modifications de code, proposer de l'aide de toute sorte, [traduire les textes](../cadrage/i18n.md), vérifier l'accessibilité, lire la [documentation d'architecture](../cadrage/architecture.md) etc...
|
||||
Il existe des tas de façons de contribuer à un logiciel libre comme Framadate. Vous pouvez __discuter__ avec d'autres personnes de ce que vous souhaiteriez voir naître dans le logiciel, __essayer__ de l'utiliser dans sa version expérimentale, __mettre en place une démo__ ou un service publiquement utilisable, __écrire__ des modifications de code, proposer de l'aide de toute sorte, [traduire les textes](cadrage/i18n.md), vérifier l'accessibilité, lire la [documentation d'architecture](../doc/cadrage/architecture.md) etc...
|
||||
|
||||
* Avoir un compte Framateam, et Framagit si vous souhaitez contribuer au code
|
||||
* Examiner les tickets
|
||||
Discuter avec les autres membres participant, sur un ticket en particulier et aussi dans les canaux de framateam
|
||||
* Nous avons créé deux canaux: un pour les discussions générales, et un autre pour les discussions techniques de dev. Prenez soin de bien cibler le canal dans lequel vous communiquez afin de ne pas faire peur aux gens qui ne codent pas et qui souhaitent contribuer de toutes les autres façons.
|
||||
* Une fois d'accord avec les autres, mettre à jour votre dépot de travail local. Voir [la doc d'installation / getting started](../GETTING_STARTED.md) à ce sujet.
|
||||
* Une fois d'accord avec les autres, mettre à jour votre dépot de travail local. Voir [la doc d'installation / getting started](GETTING_STARTED.md) à ce sujet.
|
||||
* Utiliser la branche `develop`
|
||||
```
|
||||
git checkout develop
|
20
doc/GETTING_STARTED.md
Normal file
@ -0,0 +1,20 @@
|
||||
# Pour débuter - getting started
|
||||
Clonez le dépot, installez les dépendances, et lancez le serveur local qui se recharge lorsque vous sauvegardez des fichiers dans le dépot. Les fois suivantes vous n'aurez qu'a lancer yarn start.
|
||||
```bash
|
||||
# clone the repo
|
||||
git clone https://framagit.org/framasoft/framadate/funky-framadate-front.git
|
||||
cd funky-framadate-front
|
||||
# install yarn
|
||||
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
|
||||
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
|
||||
sudo apt-get update && sudo apt-get install yarn
|
||||
|
||||
yarn install --pure-lockfile
|
||||
yarn start
|
||||
# and now check your browser http://localhost:4200
|
||||
```
|
||||
|
||||
Pour interagir avec la base de données, il vous faudra également faire démarrer l'API Symfony de backend dans l'autre dépot, qui se lance par défaut sur le port 8000.
|
||||
|
||||
# Pas de config docker
|
||||
Nous n'avons pas actuellement de config docker qui solutionnerait tout ça, les merge request sont les bienvenues! :)
|
@ -19,12 +19,3 @@ Quelques lignes à vérifier:
|
||||
* système de recherche basique
|
||||
|
||||
N'ayez pas peur de demander de l'aide
|
||||
|
||||
## Structure html
|
||||
|
||||
* Ajouter une attribut lang="fr" sur l'élément html
|
||||
* Chaque page doit avoir un title unique (ex: `title="Création de sondage - étape 1/7 - BarracuDate"`)
|
||||
* Chaque page doit avoir un h1 (ex: `<h1>Création de sondage - étape 1 sur 7</h1>`)
|
||||
* Un élément de texte ne peut pas être dans un élément div ou span (ex: <p>300 caractères maximum</p>)
|
||||
* Éviter d’utiliser l’attribut tabindex
|
||||
* Les actions doivent être portées par des éléments button (et non <i> ou <a>)
|
@ -1,4 +1,4 @@
|
||||
# temporary documentation of backend API endpoints
|
||||
// TODO: File to be deleted : just temporary documentation of backend API endpoints
|
||||
|
||||
------------------------------------------ ---------- -------- ------ ------------------------------------------------
|
||||
Name Method Scheme Host Path
|
13
doc/cadrage/i18n.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Internationalisation - i18n
|
||||
Toutes les chaînes de texte doivent être disponible en minimum deux langues: Français et Anglais.
|
||||
|
||||
La documentation a été pensée pour être compréhensible en premier lieu par des personnes francophones, le projet étant issu de Framasoft et de personnes uniquement Francophones, nous avons jugé que c'était le moyen le plus efficace pour le faire grandir.
|
||||
|
||||
Voir les fichiers src/assets/i18n [EN.json](/src/assets/i18n/EN.json) et [FR.json](/src/assets/i18n/FR.json)
|
||||
La traduction se base sur un système de clés-valeur.
|
||||
Les clés sont entrées dans les templates html, et c'est la config d'Angular qui les traduit selon la langue demandée par le visiteur du site.
|
||||
|
||||
Chaque fichier de traduction est déclaré dans le [AppModule](../../src/app/app.module.ts) avec le module @ngx-translate. Examinez l'exemple pour rajouter votre propre traduction.
|
||||
|
||||
Utilisez des sous groupes dans vos traductions afin de mieux segmenter les chaines de caractère par page et selon le sens qu'elles sous tendent.
|
||||
|
@ -2,6 +2,10 @@
|
||||
|
||||
[[_TOC_]]
|
||||
|
||||
|
||||
![Diagramme des cas d'utilisations décrits dans la suite du document](uploads/uml/diagramme_cas_utilisation.png)
|
||||
|
||||
|
||||
# Glossaire
|
||||
|
||||
| Terme | Signification |
|
@ -31,9 +31,9 @@ https://framagit.org/framasoft/framadate/funky-framadate-front/-/boards
|
||||
|
||||
## Ressources
|
||||
|
||||
* Discussion : [https://framateam.org/ux-framatrucs/channels/framadate]()
|
||||
* Repo front/dev : [https://framagit.org/framasoft/framadate/funky-framadate-front/tree/dev]()
|
||||
* Repo back : [https://framagit.org/framasoft/framadate/framadate ]()
|
||||
* Discussion : https://framateam.org/ux-framatrucs/channels/framadate
|
||||
* Repo front/dev : https://framagit.org/framasoft/framadate/funky-framadate-front/tree/dev
|
||||
* Repo back : https://framagit.org/framasoft/framadate/framadate
|
||||
* Maquettes Zeplin : demander l'accès à maiwann
|
||||
* La démo : [https://framadate-api.cipherbliss.com/]()
|
||||
* Vidéo de présentation : [https://nuage.maiwann.net/s/JRRHTR9D2akMAa7]()
|
||||
* La démo : https://framadate-api.cipherbliss.com/
|
||||
* Vidéo de présentation : https://nuage.maiwann.net/s/JRRHTR9D2akMAa7
|
@ -62,7 +62,7 @@ Il est difficile d'entrer dans le projet en absence de spécifications écrites.
|
||||
|
||||
* Discussion : https://framateam.org/ux-framatrucs/channels/framadate
|
||||
* Repo front/dev : https://framagit.org/framasoft/framadate/funky-framadate-front/tree/dev
|
||||
* Repo back : https://framagit.org/tykayn/date-poll-api
|
||||
* Repo back : https://framagit.org/framasoft/framadate/framadate
|
||||
* Maquettes Zeplin : https://scene.zeplin.io/project/5d4d83d68866d6522ff2ff10
|
||||
* La démo : https://framadate-api.cipherbliss.com/
|
||||
* Vidéo de présentation : https://nuage.maiwann.net/s/JRRHTR9D2akMAa7
|
@ -1,551 +0,0 @@
|
||||
## v0.6.0 (2021-05-17)
|
||||
|
||||
* add mkdoc for all documentation [View](https://bitbucket.org/projects/test/repos/my-project/commits/6e0202a5a42256f4e2b49f746d7888a6608214f8)
|
||||
* add changelog script [View](https://bitbucket.org/projects/test/repos/my-project/commits/b3833ec830100a9197fb9cb84cb4a9670f21e42d)
|
||||
* 1.1.0 [View](https://bitbucket.org/projects/test/repos/my-project/commits/38388946143eb7881912023d4d3f2dc4403c62fe)
|
||||
* messing with package version [View](https://bitbucket.org/projects/test/repos/my-project/commits/08ab0482dd5e25cb8152b92323660c35228c215d)
|
||||
* 0.6.0 [View](https://bitbucket.org/projects/test/repos/my-project/commits/52792ba6472e4be43d2ce750c87d3c9097155da6)
|
||||
|
||||
|
||||
## v0.5.0 (2021-05-04)
|
||||
|
||||
* :zap: remove generated documentation from compodoc [View](https://bitbucket.org/projects/test/repos/my-project/commits/f358120516bbf027e53758c93a581f93bed3d10a)
|
||||
* :book: merge documentation from the wiki in the folder doc [View](https://bitbucket.org/projects/test/repos/my-project/commits/c689a679e21e6e8fd4efff71ef95d555f9c59d82)
|
||||
* :book: update contribute [View](https://bitbucket.org/projects/test/repos/my-project/commits/c4982267d2ae6980ef6f72694cb322ae8bec6092)
|
||||
* :zap: ability to customize app title and app logo in header from environment vars. fixes #87 #88 #89. [View](https://bitbucket.org/projects/test/repos/my-project/commits/621101aa38e5732885aa184174cd1d97a157c49f)
|
||||
* :book: move documentation to doc folder [View](https://bitbucket.org/projects/test/repos/my-project/commits/70acabb056c61da806f565927e063dba66e7592e)
|
||||
* :book: DOC : desired feature added in doc [View](https://bitbucket.org/projects/test/repos/my-project/commits/14d2a109d30d29a1a83d616d3e543d0cdf4bc084)
|
||||
* :alien: i18n header menu, :gears: splits routes, :fix: RED theme fix in switch [View](https://bitbucket.org/projects/test/repos/my-project/commits/b4f496b08dbd2bdea757b9f2feb1007a81d8b86e)
|
||||
* hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/6db96397ea4fc7735f4a921cd8a9a912dafa2221)
|
||||
* remove some broken automation [View](https://bitbucket.org/projects/test/repos/my-project/commits/5f072fe3abee9c0b5cc5126a11188cd5b70a58c7)
|
||||
* only send list of polls by email to user [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5214fdd9757a207ee01a0e263c1ab63df1edc12)
|
||||
* move dev menu slider and show it only in dev mode env [View](https://bitbucket.org/projects/test/repos/my-project/commits/6059533c3635684d8422c2bf1c12a975390af5b4)
|
||||
* start form [View](https://bitbucket.org/projects/test/repos/my-project/commits/8cac3d18621c35f7f3d73fcc699017f04cefdc6b)
|
||||
* add form array for choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/d9301559ef99902c3901afd0ee4a6a5035e77b81)
|
||||
* :hammer: test the build with gitlab CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/41fd153991fb1e324664cd27b9c2d4aca8a4f408)
|
||||
* add variables from env in footer [View](https://bitbucket.org/projects/test/repos/my-project/commits/b0026fabc471d34f718c8aff95fca2a33c0b3623)
|
||||
* start combine choices array [View](https://bitbucket.org/projects/test/repos/my-project/commits/4bec5828b386b4be2d73837c97731997e1588106)
|
||||
* dynamically add choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/8c119739a72fc6767e46791c2341656f53e7fc04)
|
||||
* add all config controls [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5b8d5b65ec32f170610f0186ed08b6fc23a1568)
|
||||
* multiple choices for creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/fa534af3ab200835a16f38c2e7b5998cbadb45f6)
|
||||
* :alien: i18n import po files from previous framadate version [View](https://bitbucket.org/projects/test/repos/my-project/commits/a5b0d2c2d45aa4b58fdd08669568dd7f22b5d795)
|
||||
* :alien: i18n add extraction lib [View](https://bitbucket.org/projects/test/repos/my-project/commits/60eeddbf21a575e84f054afe5defe54e258bb54f)
|
||||
* :bug: select lang wigthout lifecycle bug [View](https://bitbucket.org/projects/test/repos/my-project/commits/10c1930e4d5c4be1ec7d6af208dc939705020e89)
|
||||
* reorder questions [View](https://bitbucket.org/projects/test/repos/my-project/commits/8df2b95c1e287ab7a3a4f0127b8ec616260126dc)
|
||||
* translate homepage [View](https://bitbucket.org/projects/test/repos/my-project/commits/d07f51dd910ad243e030cfd1fdba041f8264d1e2)
|
||||
* togglable advanced options [View](https://bitbucket.org/projects/test/repos/my-project/commits/d3042b3723839f6b4710b77024f0f0fb10a87455)
|
||||
* add keybaord shortcuts on array for choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/4769ecefc3b6b59887baec2625bd5e35f23f6554)
|
||||
* :zap: more settings for admin form with time and answers groups [View](https://bitbucket.org/projects/test/repos/my-project/commits/82910a9aae0750c80b87a04bd1c6e6634e68f05b)
|
||||
* add time to date func [View](https://bitbucket.org/projects/test/repos/my-project/commits/94162c796cf5016634eccdeb18fc132711055eb2)
|
||||
* :alien: convert sentences from framadate1 to json files [View](https://bitbucket.org/projects/test/repos/my-project/commits/a4c2387e1257e9684147bb7af9184d4550fa2b8e)
|
||||
* add sentences in fr and en from framadate 1 [View](https://bitbucket.org/projects/test/repos/my-project/commits/3700ede667e90a43eb39f301a396feacbe05d570)
|
||||
* :art: add pictures from undraw, translate sentences on homepage [View](https://bitbucket.org/projects/test/repos/my-project/commits/04f04d622dea3f963273eb038bc1c99e2832f1ca)
|
||||
* reuse automatic slug from poll config in form [View](https://bitbucket.org/projects/test/repos/my-project/commits/3306e7c29d4f811a6ba624595457768e8c237bcc)
|
||||
* adding reodering of choices beginning [View](https://bitbucket.org/projects/test/repos/my-project/commits/1745762ba3125c7ad054284e4fd6b4020482d6f2)
|
||||
* :zap: add api version config in env [View](https://bitbucket.org/projects/test/repos/my-project/commits/1167b692eaea2ffe711a7a56797ed3017624a184)
|
||||
* add fields to config of poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/4eef4c4220a4b8523e6f7a430afda12c563edaae)
|
||||
* try to get the list of polls [View](https://bitbucket.org/projects/test/repos/my-project/commits/1b49231d924d0c3a69d43d5c02645b4d2621d50c)
|
||||
* create success page and route [View](https://bitbucket.org/projects/test/repos/my-project/commits/03f7c49c519e2db062de3d64a1cfdd8c1f109e05)
|
||||
* spacing buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/d4e5c614a9397fdd7feaa0dc6da1d1160ccd4c52)
|
||||
* split of creation components [View](https://bitbucket.org/projects/test/repos/my-project/commits/84b69a1366dacb521d4295c99eb630f636429ac4)
|
||||
* homepage texts [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d9f1f7d40468d0b2ba3634e7cdd6cbf3f1a8118)
|
||||
* home page reorder and statistics, todo component [View](https://bitbucket.org/projects/test/repos/my-project/commits/5bac37a7905ba1ccd16bab3568a366bf8b9d9090)
|
||||
* link to static pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/1717f738d19e65c22d91b1f429cde654fb677ad0)
|
||||
* include advanced choices and toggle visibility of sub component [View](https://bitbucket.org/projects/test/repos/my-project/commits/feb0de8270204c31cbb92f6a6420644cc1a99e9e)
|
||||
* ordering base fields [View](https://bitbucket.org/projects/test/repos/my-project/commits/f96dc1f3c44b413eef1b64b4ff9ea8abca9fc34a)
|
||||
* link to base config [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d49389d117b8060fd343e7815b0894e4413667d)
|
||||
* add choices for the future [View](https://bitbucket.org/projects/test/repos/my-project/commits/237984c04073efa133ee2fd5ba18ee90a9e16a0e)
|
||||
* harmonizing poll default properties with payload and advanced config [View](https://bitbucket.org/projects/test/repos/my-project/commits/2a4219e14941679da323d1fd066d6fb6ca62e6f9)
|
||||
* testing ciphering page [View](https://bitbucket.org/projects/test/repos/my-project/commits/40c0c3888902b046c9ab9f65549c57abbff5a1c3)
|
||||
* fill poll config default [View](https://bitbucket.org/projects/test/repos/my-project/commits/7140072ecc6d624e6e660cf694ea5d6b4b5c6376)
|
||||
* patch kind of poll with patchvalue [View](https://bitbucket.org/projects/test/repos/my-project/commits/77cf4c6d04b5a7c7689e834dcc166dd5eca56b22)
|
||||
* advanced button change color when active [View](https://bitbucket.org/projects/test/repos/my-project/commits/ce00a3ce695e7e6728bdeace31a66cc17359dcab)
|
||||
* translate calendar contents, space options for days [View](https://bitbucket.org/projects/test/repos/my-project/commits/2edb828aa3a1e0d9e39f4abc6eefc0e0ef06c96b)
|
||||
* visual sections for date selection [View](https://bitbucket.org/projects/test/repos/my-project/commits/de679721d1047d8ee7d780b23f0298b47af7bb21)
|
||||
* drag and drop time interval [View](https://bitbucket.org/projects/test/repos/my-project/commits/7ca87e28b44887138b0b8b05bde47cca9024d990)
|
||||
* display hour ranges [View](https://bitbucket.org/projects/test/repos/my-project/commits/5f4c2e04af08c896f3fb64d56157d007600f6f04)
|
||||
* use crypto lib [View](https://bitbucket.org/projects/test/repos/my-project/commits/1ab5255bfa2aff83774132965842e357eb8494e4)
|
||||
* add lib crypto [View](https://bitbucket.org/projects/test/repos/my-project/commits/4df2e00cbe228a19b10821be5025c0b11aeb27da)
|
||||
* copy button [View](https://bitbucket.org/projects/test/repos/my-project/commits/760bde7e3069e6c2f84724b05c80c7260f7fc2a7)
|
||||
* easy ciphering working with and without salt [View](https://bitbucket.org/projects/test/repos/my-project/commits/3e0c1ff3750a5f986dd850b6a6b765e19b8a1ad5)
|
||||
* mixed salt for ciphering [View](https://bitbucket.org/projects/test/repos/my-project/commits/0885df23df39b20fa8ee16aa7c2b3fb1c13a8ec3)
|
||||
* spacing dev menu button [View](https://bitbucket.org/projects/test/repos/my-project/commits/51de2b2e028305eabfdb9c6bb91a5758aa815344)
|
||||
* add md5 lib to ciphering page [View](https://bitbucket.org/projects/test/repos/my-project/commits/d72e7763da7e60d551b3ee585555bfa83e6ddd11)
|
||||
* listing char codes [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5411ab425368ce6e3a7b024e8d9fb711e041018)
|
||||
* compute entropy [View](https://bitbucket.org/projects/test/repos/my-project/commits/ddf5b40ef45290430f2c681ae0368ee2b98abecf)
|
||||
* resize table for entropy [View](https://bitbucket.org/projects/test/repos/my-project/commits/e32db4983d014403c97e93a3faebb7ab2e318a59)
|
||||
* compare entropy with generated pass [View](https://bitbucket.org/projects/test/repos/my-project/commits/e9a9d1a959b8141bdb56fe01d8d0ae7bcf2c8b06)
|
||||
* chiffrement matrice ok [View](https://bitbucket.org/projects/test/repos/my-project/commits/73ad7426ee1f1b1b31f252ea30d16a810272d792)
|
||||
* hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/54ece76c7e916aa919d9e5abaca69efd7c12968d)
|
||||
* fix types [View](https://bitbucket.org/projects/test/repos/my-project/commits/7b5cf59b9979f0da70af0f0ba7dd07c743ec851d)
|
||||
* update env for prod [View](https://bitbucket.org/projects/test/repos/my-project/commits/3c3dddafa52f520658a70291b66fd42505aeee48)
|
||||
* fix some production build warnings [View](https://bitbucket.org/projects/test/repos/my-project/commits/2993fc5cb5204bfd35ddc393b6805176e150461b)
|
||||
* add stats [View](https://bitbucket.org/projects/test/repos/my-project/commits/2af45ae72708bec310febde7cbcf33020a1b83f0)
|
||||
* using hash routes [View](https://bitbucket.org/projects/test/repos/my-project/commits/e63bbab75565370cdafe1c374bea97f5d777c71f)
|
||||
* hide some components [View](https://bitbucket.org/projects/test/repos/my-project/commits/f3f2d6623bb1bc7aa8d36d2144ac46a47c98470a)
|
||||
* choice template questions [View](https://bitbucket.org/projects/test/repos/my-project/commits/21040df287ccb46e9384273b6a352378a1d4ba76)
|
||||
* date selector as question answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/4a89b715a9e9a9f058c64f3384bd115a89170138)
|
||||
* add theming in vars with blue variation [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2806371585ba1d1810bfbb2edc977264fd6ba5d)
|
||||
* default colors [View](https://bitbucket.org/projects/test/repos/my-project/commits/a744bf9931e472afd6a01bbb343c19a6fe095b03)
|
||||
* setup theme comments [View](https://bitbucket.org/projects/test/repos/my-project/commits/2562b21d2ff9686d8a4cc35645f7ebed81093cd3)
|
||||
* add fetching a poll with a pass hash [View](https://bitbucket.org/projects/test/repos/my-project/commits/3850f3811c135005131bdffef8cd760fa9cb9fb5)
|
||||
* manage consultation path [View](https://bitbucket.org/projects/test/repos/my-project/commits/6cb32cb2e19276e28ee3d6c5bc7777a00edfc8ea)
|
||||
* display de sondage de démo [View](https://bitbucket.org/projects/test/repos/my-project/commits/21aa634ce52beeab60bfc402178840f1f2eb0769)
|
||||
* montrer consultation et préciser si aucun vote [View](https://bitbucket.org/projects/test/repos/my-project/commits/56273946c3f598e58df960a56756d877d443ece7)
|
||||
* display title on poll page [View](https://bitbucket.org/projects/test/repos/my-project/commits/d84809d62a032dbe37d8da746fec12fc486a7fca)
|
||||
* style on selected items in consultation page [View](https://bitbucket.org/projects/test/repos/my-project/commits/0c08e802c9a98d4182853092d615b4fd5f4994b1)
|
||||
* scroll to top on route change [View](https://bitbucket.org/projects/test/repos/my-project/commits/74a928800edd8d67cfc428eb67d27aaddc33cffa)
|
||||
* send form in dev mode, fill title demo [View](https://bitbucket.org/projects/test/repos/my-project/commits/215178efa9c6a3bc5e07d11b97dd0109ab356899)
|
||||
* add comment on display [View](https://bitbucket.org/projects/test/repos/my-project/commits/078f63f742d29e5c1cb7426560047830f165ea97)
|
||||
* export results added, models updates [View](https://bitbucket.org/projects/test/repos/my-project/commits/1e90d92ab9f6c25643600a254d032c486516a692)
|
||||
* transmettre l'information d'expiration du sondage au front [View](https://bitbucket.org/projects/test/repos/my-project/commits/163b89b03ffc11c277f916379cb5631b0256d3af)
|
||||
* fix models for backend update [View](https://bitbucket.org/projects/test/repos/my-project/commits/e45b490c2fdbdff37e5a252a478091b52b287612)
|
||||
* key created_at for comment, format date [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d3457cf6fa872fe277dcff3a43b93d8be5353a7)
|
||||
* show counters on answers and favourite answer [View](https://bitbucket.org/projects/test/repos/my-project/commits/0abf924caedeebe008292c230dae3a2af40f028f)
|
||||
* display details too [View](https://bitbucket.org/projects/test/repos/my-project/commits/9a4a72a24c781e24f773462c8978cf59ded6821b)
|
||||
* info in modal [View](https://bitbucket.org/projects/test/repos/my-project/commits/729dac95993b4997eae4691bcfaec2630714a8aa)
|
||||
* fixes for building in prod [View](https://bitbucket.org/projects/test/repos/my-project/commits/7a0061eeb1d2018857a78dcff9674df2076c0999)
|
||||
* stack of vote relié au formulaire de commentaire [View](https://bitbucket.org/projects/test/repos/my-project/commits/620a7b99fac22a6809149d753410f5bf885c0570)
|
||||
* set choices and toggle votes in votestack [View](https://bitbucket.org/projects/test/repos/my-project/commits/f1e6b5955ee16f4ec65828f6bd48930b606b879e)
|
||||
* display stack answer and toggle fluently between answers to votes [View](https://bitbucket.org/projects/test/repos/my-project/commits/4464a0af2cae1c9c9c25c6b1762d28634c3b4207)
|
||||
* default value of vote added [View](https://bitbucket.org/projects/test/repos/my-project/commits/cbc4bd8f5d85b0a6f1e3bc797c47564cee5c4e62)
|
||||
* choice button refacto [View](https://bitbucket.org/projects/test/repos/my-project/commits/3abef619c8ce77cc1f9ba014a952fbb96456b01d)
|
||||
* send stack of votes button linked to api [View](https://bitbucket.org/projects/test/repos/my-project/commits/7a83beae8e5ca64c21759b3337de0ecb30c06937)
|
||||
* trying to send vot stack but getting CORS issue [View](https://bitbucket.org/projects/test/repos/my-project/commits/30d4adec373ae2714b25d46e704beef73785cfc0)
|
||||
* use httpclient [View](https://bitbucket.org/projects/test/repos/my-project/commits/e61542b6521722eafafb989dd88fa482ae07caac)
|
||||
* default backend to framadate demo api [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2b8056b7eb35fef9de30adc7c897ee6c5d2d2a5)
|
||||
* add good hash in route [View](https://bitbucket.org/projects/test/repos/my-project/commits/d5bc5777b787060dfaa84c1ed7599bff272b5507)
|
||||
* move old stuff [View](https://bitbucket.org/projects/test/repos/my-project/commits/fdcb7327f0b65a4ce8c7ae6f8a5bec9f5592c026)
|
||||
* rename utils services [View](https://bitbucket.org/projects/test/repos/my-project/commits/b9181b5b3fe6b7163ffefbb0bea3e70a186bee53)
|
||||
* auto send vote in dev mode [View](https://bitbucket.org/projects/test/repos/my-project/commits/3a89645e66b9445e61bf67c50805b9682a538931)
|
||||
* manage mobile menu, and add poll title to page title [View](https://bitbucket.org/projects/test/repos/my-project/commits/31f0f19a9ae2120ac3394414e79649a44ee2de14)
|
||||
* nav disable default show [View](https://bitbucket.org/projects/test/repos/my-project/commits/78a88d3163f73a161649a0ed17d4038f458d5bcc)
|
||||
* nav items for demos in mobile menu [View](https://bitbucket.org/projects/test/repos/my-project/commits/69f8eac147f413a1f7bbb9c2d2b12b6526e63419)
|
||||
* change icons for answer [View](https://bitbucket.org/projects/test/repos/my-project/commits/9e4d5187b523891568387526e1a7cc749d6a5a44)
|
||||
* toast message on error send vote stack [View](https://bitbucket.org/projects/test/repos/my-project/commits/765299e1c3ae69bebfbad281592d9460ef4f9aa4)
|
||||
* creation poll style, fill DTO for creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/585d3a215e62ee115d0bace3c5bc0c6f650c2b59)
|
||||
* auto save on dev env [View](https://bitbucket.org/projects/test/repos/my-project/commits/12a41b502217ce8c2f0df9673ca7a21f80550409)
|
||||
* flatten form fields [View](https://bitbucket.org/projects/test/repos/my-project/commits/d08bba4fcb4ffbb5b4b28cd948babc21059b8bfe)
|
||||
* advanced fields flattened [View](https://bitbucket.org/projects/test/repos/my-project/commits/e405a09c78af01fdb02a0fa7b4f75fc92cee7c34)
|
||||
* splitting date choices with a separator [View](https://bitbucket.org/projects/test/repos/my-project/commits/975997b7675876f5596e34533e50d76f1c6c8809)
|
||||
* group display of days [View](https://bitbucket.org/projects/test/repos/my-project/commits/86c0ff815f824b9119d36482cd85fc668eccf7cb)
|
||||
* ability to toggle answers on grouped choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/16db2a69cf687e2f99b9faec96e87c4d89d06458)
|
||||
* update url to copy after creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/bfdb18b316ffaf614b58a33ebdb195d1e793cc0a)
|
||||
* link function [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2ee8ec668d252a23389780f977bba3c58a79512)
|
||||
* hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/dc382017a2ab64fddbe6ca6f31b8419f24e8c0b3)
|
||||
* fix url public [View](https://bitbucket.org/projects/test/repos/my-project/commits/59cb917ea36ac9cb4b21fb2d93fe01bc067c8935)
|
||||
* fix test kind [View](https://bitbucket.org/projects/test/repos/my-project/commits/ed13c98b99048078a9ff3bd23ff32ab34f68c349)
|
||||
* hash routes re enabled [View](https://bitbucket.org/projects/test/repos/my-project/commits/d7a35e91edb3d6f75ddb0946d8d288b20627c925)
|
||||
* fix get participation url [View](https://bitbucket.org/projects/test/repos/my-project/commits/9a013f6d2cd29832d98fa81352f39db0a12fe60c)
|
||||
* better mix on creation of poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/d40aa6a3ae0152f53da4f29379800ab146b8fc89)
|
||||
* no auto send form [View](https://bitbucket.org/projects/test/repos/my-project/commits/c3026639948ce0b4adc5ef22704c076e79407fbd)
|
||||
* fix deps to config prop [View](https://bitbucket.org/projects/test/repos/my-project/commits/e7343810d5612f5ce30d41536c5c9a1d77093d31)
|
||||
* env message demo dans le header [View](https://bitbucket.org/projects/test/repos/my-project/commits/d222d88872012f4cf22c34da9370bb6d2cba5d71)
|
||||
* home display stored polls [View](https://bitbucket.org/projects/test/repos/my-project/commits/1bfe747e4cd256a42bd4c17f9b25fc1c3175131a)
|
||||
* more responsive menu header [View](https://bitbucket.org/projects/test/repos/my-project/commits/bf1df96dcdbdf15905a8db2d61716466c838cfd8)
|
||||
* enable loading state in api creation, success page update [View](https://bitbucket.org/projects/test/repos/my-project/commits/a969b30a03bd6e2ab93d352b5fceccd8420b6983)
|
||||
* add to local polls after creation, update poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/10177d793bf0af056f96e4873b4bbfd12d7c0bee)
|
||||
* fix icon [View](https://bitbucket.org/projects/test/repos/my-project/commits/f6b522748a3e78735926764580a08145def159de)
|
||||
* display of success links [View](https://bitbucket.org/projects/test/repos/my-project/commits/1755f205ad41e6b10fa8b656746d65e578456bbc)
|
||||
* update custom_url with title [View](https://bitbucket.org/projects/test/repos/my-project/commits/f1e5903d0aa2d444b9dd5dc1ecdf3f30e2b61f22)
|
||||
* smaller uniq id in custom_url [View](https://bitbucket.org/projects/test/repos/my-project/commits/5d39b7aa3e5f045f4270729f6c6daa2cd9ea79a9)
|
||||
* erasable button on first field [View](https://bitbucket.org/projects/test/repos/my-project/commits/6fdb56786aa1cbd33badb80d00184aefcf6b64bd)
|
||||
* same time span for every day by default, clean config [View](https://bitbucket.org/projects/test/repos/my-project/commits/c0ca623885d923c873c7d5796f1f687dfa148f8e)
|
||||
* display time slices [View](https://bitbucket.org/projects/test/repos/my-project/commits/af4dfacec9107678069b2dd909473ac68549a728)
|
||||
* empty and reset time slices [View](https://bitbucket.org/projects/test/repos/my-project/commits/1d8aeb2f54711709cd6209fde3615c43e2d78598)
|
||||
* display all on creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/d7eac8d56c68923b74516d688eeea3d421201567)
|
||||
* display fields errors [View](https://bitbucket.org/projects/test/repos/my-project/commits/9cd847be8f099509a55518b092b1d0645c1967ee)
|
||||
* less logs for validation [View](https://bitbucket.org/projects/test/repos/my-project/commits/186e5e36da6f4b424df0e127d7f52980551ef787)
|
||||
* separate choice from form [View](https://bitbucket.org/projects/test/repos/my-project/commits/f6ce22480cbd1fe1ed9e1bb0a038cc6df8fa2030)
|
||||
|
||||
|
||||
## v0.4.0 (2020-06-26)
|
||||
|
||||
* Ajout du lien vers le rendu [View](https://bitbucket.org/projects/test/repos/my-project/commits/983c64a1b4f542d743ee8f1029a4ca8662a3df95)
|
||||
* Pose les textes de la première page de la maquette [View](https://bitbucket.org/projects/test/repos/my-project/commits/e9a85fe44a505a0444d72ae43e0a6a2e8003da3e)
|
||||
* Changement de la structure HTML de base, inspiré de https://github.com/DavidBruant/better-defaults [View](https://bitbucket.org/projects/test/repos/my-project/commits/57b023425107ff786381339dab09e0344e03eb26)
|
||||
* Habillage minimum de l'accueil [View](https://bitbucket.org/projects/test/repos/my-project/commits/2ca0982f6ee7181e701680d9ee63108bc34028d3)
|
||||
* Ajoute les pages statiques de la navigation [View](https://bitbucket.org/projects/test/repos/my-project/commits/fac4efab3c48c70a0527641f0504031878141502)
|
||||
* Ajoute un script docker pour lancer un serveur localement pour développer sur la maquette [View](https://bitbucket.org/projects/test/repos/my-project/commits/e30135786a4f6c3d39588afa00d17491a9406d1d)
|
||||
* Documente le processus pour lancer le projet localement [View](https://bitbucket.org/projects/test/repos/my-project/commits/caf4cf7d2c7dd4969929c6290ab311df44bf1eaf)
|
||||
* Ajout du parcour vers le sondage classique [View](https://bitbucket.org/projects/test/repos/my-project/commits/a248b803079b2ae58d86e8fa1b3e2cdb57fd8f74)
|
||||
* ajout des champs de formulaire dans la page notifications [View](https://bitbucket.org/projects/test/repos/my-project/commits/1cc8e6beb442d3b365b73f0be2f525ff9f1bcb0d)
|
||||
* Création du fichier js [View](https://bitbucket.org/projects/test/repos/my-project/commits/cb07e90e63ae8ec4ab1f91fe01630f7cc0cd8770)
|
||||
* Ajoute le lien vers les natural language form [View](https://bitbucket.org/projects/test/repos/my-project/commits/b3b9797e8cd437efefee1ae6028dba433d62874e)
|
||||
* Bifurcation sur le sondate en fonction du choix [View](https://bitbucket.org/projects/test/repos/my-project/commits/0f6abfa7b9ceea6fdd0d17366e77ea3929b9beb0)
|
||||
* Usage du localStorage [View](https://bitbucket.org/projects/test/repos/my-project/commits/affb5500e734c94aa6526d1e8106f3b849871160)
|
||||
* Ajoute la ponctuation [View](https://bitbucket.org/projects/test/repos/my-project/commits/23902aca1fb69cd40556896be744bfbf053dd8b8)
|
||||
* Affiche un texte par défaut, et propose une popup pour saisi [View](https://bitbucket.org/projects/test/repos/my-project/commits/053d24c158c6e55888f42262d481d6bfb30e8013)
|
||||
* Changement du nom, sans javascript, ou avec [View](https://bitbucket.org/projects/test/repos/my-project/commits/bf23bee2827d9197b646168c1a6606c13f890ed4)
|
||||
* Généralise l'usage du champs text [View](https://bitbucket.org/projects/test/repos/my-project/commits/105b98388573ba5d6a1abe91a9e5b67db51c9169)
|
||||
* Embelli les deux champs texte de la fin de sondage [View](https://bitbucket.org/projects/test/repos/my-project/commits/3229d14993c61eeb595971191c6b86c76707bb9d)
|
||||
* Embelli le champ texte de l'index [View](https://bitbucket.org/projects/test/repos/my-project/commits/44b60adba0ee9c5b6ac515a926d7f4960023ba32)
|
||||
* Base de reflexion pour l'ajout d'option [View](https://bitbucket.org/projects/test/repos/my-project/commits/91b94e806f1572a096d655932f352c26540c312c)
|
||||
* Deploy on funky [View](https://bitbucket.org/projects/test/repos/my-project/commits/0ec23c03d3d16bc5f0979f678e696bdfed4f63a0)
|
||||
* Update .gitlab-ci.yml [View](https://bitbucket.org/projects/test/repos/my-project/commits/9a045b4608b87d85f3ace567042991dab7b85828)
|
||||
* Update .gitlab-ci.yml [View](https://bitbucket.org/projects/test/repos/my-project/commits/8ecb77c322df2b3d331c8a60b3c61bd7ac797d9a)
|
||||
* Update .gitlab-ci.yml [View](https://bitbucket.org/projects/test/repos/my-project/commits/5edd7c6cd5edfae997ec2e4cece9fc524e51cebe)
|
||||
* give up on bash & alpine [View](https://bitbucket.org/projects/test/repos/my-project/commits/ee2dfb7002c1a553e123f58ff1b3a5b1df7f63f4)
|
||||
* Recherche de sondate en deux temps [View](https://bitbucket.org/projects/test/repos/my-project/commits/55ca50890f7d132bb626811aa9e50cce24d5f996)
|
||||
* Déplace la date plus haut dans la page des notif. [View](https://bitbucket.org/projects/test/repos/my-project/commits/4d8e493c7049fbb9299c2b93fe2e914518c88f4c)
|
||||
* Selectionne les options d'un sondage dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/d151724e87b20500d19c022fa3a8f90066dfa533)
|
||||
* Ajoute des informations sur la page de validation [View](https://bitbucket.org/projects/test/repos/my-project/commits/23b43fe5345f9a8fe2b6e77531def3eabb8a8125)
|
||||
* Ajoute une option image + lien [View](https://bitbucket.org/projects/test/repos/my-project/commits/cdbe0a12e16156ae2ab7a4a854fdb57dd806d644)
|
||||
* Ajout d'un champ texte en cas de sondage classique [View](https://bitbucket.org/projects/test/repos/my-project/commits/45319fcfd65a784f8e312a621cf3d1faaccfac6b)
|
||||
* changement de l'URL de demo [View](https://bitbucket.org/projects/test/repos/my-project/commits/d48879c8f651ac4cd288d9914903fcd9d34ab671)
|
||||
* fix(#16): amélioration de l'affichage de la page dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/d4ad832004e399a289c9fa960a30caf38e6b4570)
|
||||
* fix(#3): amélioration du design des boutons [View](https://bitbucket.org/projects/test/repos/my-project/commits/7505340c037682cf2894079aed1177499a162542)
|
||||
* fix(#4): proposition d'amélioration d'affichage des champs textes [View](https://bitbucket.org/projects/test/repos/my-project/commits/19905b208e224eb77127e664cbc6b54aeee2a5d1)
|
||||
* fix(#5): amélioration de l'apparence du textarea [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2c79980c3ef4047bf0a073fe73f5220e3ebf737)
|
||||
* fix(#15): amélioration du design de la page validation [View](https://bitbucket.org/projects/test/repos/my-project/commits/08b4e8bed0123a363f4f7d4edc6f0a11fbce2074)
|
||||
* changement de la taille de typo [View](https://bitbucket.org/projects/test/repos/my-project/commits/d99f3af9212c328a3b20d626ca542117dcc69e4a)
|
||||
* amélioration de l'affichage de l'email [View](https://bitbucket.org/projects/test/repos/my-project/commits/f566c30ee129d736c48f7a7af404bf3e8b244d38)
|
||||
* ajout du style de bouton primary [View](https://bitbucket.org/projects/test/repos/my-project/commits/0ffbdca9ad4495124c386ab84fd15c55214e6809)
|
||||
* amélioration de récapitulatif [View](https://bitbucket.org/projects/test/repos/my-project/commits/925ad5a5575af5414457b50cc6944e41d6da2591)
|
||||
* ajout d'une classe bold [View](https://bitbucket.org/projects/test/repos/my-project/commits/77329039772e1342c03d46431b3034757f919010)
|
||||
* amélioration affichage champs email [View](https://bitbucket.org/projects/test/repos/my-project/commits/bf4ccd61643aea3bdfdf7502ab693569706e1edb)
|
||||
* proposition affichage des dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/e3be6ad85a8dcea0dde9c0621b253e96d2a46cb3)
|
||||
* amélioration de l'affichage des icones [View](https://bitbucket.org/projects/test/repos/my-project/commits/de5e3604b7524952940dbc494f328f34737d1d94)
|
||||
* amélioration de l'affichage des icones [View](https://bitbucket.org/projects/test/repos/my-project/commits/531fd91aef8a8852085bd55202192fab76aa8eda)
|
||||
* Ajoute des dates, et les enregistres dans le localStorage [View](https://bitbucket.org/projects/test/repos/my-project/commits/8f309740c18e25586434e9095f51ab064c9a9587)
|
||||
* Affiche le titre du sondage dans la page de validation [View](https://bitbucket.org/projects/test/repos/my-project/commits/b1ab16bd11195294e080ecbd7a903191be55cc6a)
|
||||
* Récupère l'ancien framadate [View](https://bitbucket.org/projects/test/repos/my-project/commits/50e56a0396610ac4f970b7ecc1702222c1981421)
|
||||
* propose un champe vide par défaut [View](https://bitbucket.org/projects/test/repos/my-project/commits/4a6b039fa974e2df5b7062ee3079873f33c3949a)
|
||||
* Met à jour le readme [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5a4cde537a40691fbe2ac5dd2bacd7ea59dba76)
|
||||
* Utilise un sondage spécial date par défaut [View](https://bitbucket.org/projects/test/repos/my-project/commits/90c014222f5322ca34cdfeb5c8720cd30e69e966)
|
||||
* revois la page suivante par defaut [View](https://bitbucket.org/projects/test/repos/my-project/commits/2c9d5fa912e2ceb2cb32e1ad573d898d88305a8f)
|
||||
* affiche uniquement les options nécessaire pour les date [View](https://bitbucket.org/projects/test/repos/my-project/commits/18d649dab9201c33ce156f5450d2d68dba7d1a47)
|
||||
* reformule le texte de la page des dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/eb79e6161117d5155482249536f053e6e24c9589)
|
||||
* affiche les horaires dans un sondage spécial dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/a5f3e96ad190b6c19c6f84f57884cf3892c13a8f)
|
||||
* ajoute un bouton pour ajouter des horaires [View](https://bitbucket.org/projects/test/repos/my-project/commits/9c27b43d3bbd17ece53edde92b4ea85334f66d1c)
|
||||
* affiche le récapitulatif en fonction des dates qui ont été saisies [View](https://bitbucket.org/projects/test/repos/my-project/commits/f6ded6f5fa2df0eb957f6512b8772eb09e2f938b)
|
||||
* passage à du plus joli [View](https://bitbucket.org/projects/test/repos/my-project/commits/b5581c7127d96ee75856242b076b1b4632dea8d4)
|
||||
* Dossier screenshots pour voir l'avancement ! [View](https://bitbucket.org/projects/test/repos/my-project/commits/91460d407700f2e6feac19e97c8d9468aef83d23)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/d6c81848ea028fc10d746dbd31f2434cece8f137)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/f5cd418a5767dc70413be45285c34f5623c5117f)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/018987e6ae0dad4b878baa828ffa50ce7b82b531)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/3f80ba64ee15bd497699fafdd26e6b7a3c9540db)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/a46d24f267463b31a27a16967de7d1928c813f77)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/376f093a00f958979e09913cc708a69cca27fed2)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/18b984d478d974df5cd5db47d9306c3c95a02a2e)
|
||||
* ajoute un lien vers l'exmple de natural language form [View](https://bitbucket.org/projects/test/repos/my-project/commits/e22559a6462240b69cfc74f522bb183542743f5f)
|
||||
* Restart from scratch [View](https://bitbucket.org/projects/test/repos/my-project/commits/39242f22dbf321461d49bbf47f87274219210626)
|
||||
* removed useless files [View](https://bitbucket.org/projects/test/repos/my-project/commits/61f69c926e879604936f73e3fe4726dbd8ee5dda)
|
||||
* :tada: initialize Angular version of Framdate funky front end [View](https://bitbucket.org/projects/test/repos/my-project/commits/40b1a7bbf9c67f85d21c4212a7af51f9cb98d07b)
|
||||
* hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/512d569c54ce255f329a6883b1ba1c0bd86ffc18)
|
||||
* :zap: make routing, link data with poll config. :art: style sheets [View](https://bitbucket.org/projects/test/repos/my-project/commits/d5f71504dc66c12a0ec9df91b5fb6a646aa098fc)
|
||||
* real example of config [View](https://bitbucket.org/projects/test/repos/my-project/commits/c048c35b9d6aad8664ecd2fb208f047a1ab3eefc)
|
||||
* :zap: example of navigation [View](https://bitbucket.org/projects/test/repos/my-project/commits/42f229f686bcf61ea4d8e3c877847937a12ae16e)
|
||||
* :zap: example of navigation [View](https://bitbucket.org/projects/test/repos/my-project/commits/46cce96dab991af2de358e66daadbff9dda5079d)
|
||||
* :zap: rename components [View](https://bitbucket.org/projects/test/repos/my-project/commits/e238b0aceb1fb2776242ef74cba46b5d27feebd7)
|
||||
* :zap: make pages components, split config of poll from service [View](https://bitbucket.org/projects/test/repos/my-project/commits/56aa09df3bb71342aafd31ce95cba6e2733d1767)
|
||||
* :zap: make pages components and nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/49f4b4c13b555e0498d7bc2c8770e446d2ec2968)
|
||||
* :zap: sync answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/d413774d3b473c5355e2a52f1d0f73efa90b3ab8)
|
||||
* :zap: ability to add a new answer and focus [View](https://bitbucket.org/projects/test/repos/my-project/commits/488b9f677ac9048062304a55f9ad6d6ff5630444)
|
||||
* :zap: all steps and demo page [View](https://bitbucket.org/projects/test/repos/my-project/commits/54c7c6568d2cba66d0088b5bd0b8f3c401645445)
|
||||
* focus via injected document [View](https://bitbucket.org/projects/test/repos/my-project/commits/d9b81d3d8ef5001fd7e199afcd05051263b21973)
|
||||
* Correcting routing at the end of the form [View](https://bitbucket.org/projects/test/repos/my-project/commits/504d8faddf5ff608e63e2081bbbc2ab880860632)
|
||||
* add fonts folder [View](https://bitbucket.org/projects/test/repos/my-project/commits/3fa61053a53518c57ba142ffee180f1cf9c9732d)
|
||||
* fix(styles files): improve styles folders [View](https://bitbucket.org/projects/test/repos/my-project/commits/74b991362aa181ac64fa2882cd5ed3a1142d1536)
|
||||
* Ajouter un nouveau dossier [View](https://bitbucket.org/projects/test/repos/my-project/commits/c77792b0575902f8b52b80483808a672fbc1cf8c)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/c0491a433b2556c917fcd0771b20bf0026ef07a4)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/9a9450dc0dcf23b8931fea51ae90455947a95e87)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/0c00813056699d552f5990f825dd9612fc5443ab)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/51540252844a8019cde41f4137effa10546127d8)
|
||||
* Ajouter un nouveau dossier [View](https://bitbucket.org/projects/test/repos/my-project/commits/04d6a1b430214853e235fad96c5d8b9707114063)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/5cada8fc32beb844e0cd78a5bf3a084d10f2e05c)
|
||||
* Téléverser un nouveau fichier [View](https://bitbucket.org/projects/test/repos/my-project/commits/c1bf0631571d25cb669288caab7c1a74f14fa9a8)
|
||||
* :zap: change privacy of properties [View](https://bitbucket.org/projects/test/repos/my-project/commits/d5e5550c54102ca3e1ddf3988139f036a09bcd9a)
|
||||
* :zap: page creation or retrieve start [#28] [View](https://bitbucket.org/projects/test/repos/my-project/commits/6532538da3dfc07b9fdd328a984b431868580a67)
|
||||
* styling in mobile column [View](https://bitbucket.org/projects/test/repos/my-project/commits/56a7271325dde04724aa1648e4cb3433b56020d9)
|
||||
* :zap: lien entre multiple dates et config [View](https://bitbucket.org/projects/test/repos/my-project/commits/d941d6bed86ed922667c9fd806709efc96e6c236)
|
||||
* :art: style of cursor hovering buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/16e8ab4ec5d3fb2cd522ca890066a653f230939c)
|
||||
* :zap: add my name input in first form [View](https://bitbucket.org/projects/test/repos/my-project/commits/8eecb506c3c448273a2d52fc7f28733b09e93717)
|
||||
* Remove my editor config files [View](https://bitbucket.org/projects/test/repos/my-project/commits/4bb851640bba5054c282e97144d8916bc5aa1957)
|
||||
* Add calendar component [View](https://bitbucket.org/projects/test/repos/my-project/commits/9dace55091d8f8d5cfe72764a2ac54d0fa1de2a8)
|
||||
* added web fonts [View](https://bitbucket.org/projects/test/repos/my-project/commits/7fcd13f05a1d07be698cb40f6855c3181a2f169f)
|
||||
* Modification de la page de création [View](https://bitbucket.org/projects/test/repos/my-project/commits/189f5915c17604a6ced866a98ee735fdf73dffe7)
|
||||
* added bootstrap reboot as a CSS reset [View](https://bitbucket.org/projects/test/repos/my-project/commits/ce53ccf55f9370bc1da8202189497d9178a44c45)
|
||||
* improved heading code [View](https://bitbucket.org/projects/test/repos/my-project/commits/918999178495e5541498a02a4b495bf3b324863f)
|
||||
* Modification des liens [View](https://bitbucket.org/projects/test/repos/my-project/commits/13144d5b8c28986a450170f2421a34482b66da59)
|
||||
* ordered links file + added sass [View](https://bitbucket.org/projects/test/repos/my-project/commits/5ae1aeabeb561bff94758b50b61e9d26c83480ad)
|
||||
* improve markup, hide useless decortion for a and h1 in header [View](https://bitbucket.org/projects/test/repos/my-project/commits/c47e00a82481c8c0415b137b406623d0d63f9bd2)
|
||||
* improve global display [View](https://bitbucket.org/projects/test/repos/my-project/commits/74285393d885870340ecb60a6d8b79f360abfaea)
|
||||
* Adding basic date filling [View](https://bitbucket.org/projects/test/repos/my-project/commits/9031b60178bf2c4a25bc596161429fa6a24858c2)
|
||||
* :art: organize fonts in folders [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d03578a1d6fef9431a79950b1e24f13c71ce44c)
|
||||
* :art: remove blue in links of the bootstrap lib, add strike line on create button [View](https://bitbucket.org/projects/test/repos/my-project/commits/07989e454fb4df951177831a0e3d793cbba54198)
|
||||
* :art: striked button and icon style [View](https://bitbucket.org/projects/test/repos/my-project/commits/29bfe45acac4905a4f9df4f343993beebe9c6fee)
|
||||
* :bug: remove page folder, refacto in pages folder for creation page [View](https://bitbucket.org/projects/test/repos/my-project/commits/8291f2d8de90b54f4bd6dac6d4384589f8eabdf8)
|
||||
* fix(headings): moved h1 with border to component [View](https://bitbucket.org/projects/test/repos/my-project/commits/1753515797ddca6d20ee3464d73e0421332abdec)
|
||||
* style(default): added font color [View](https://bitbucket.org/projects/test/repos/my-project/commits/e91c66eef42b7b614458e65cef9dd80660f0a836)
|
||||
* worked on links [View](https://bitbucket.org/projects/test/repos/my-project/commits/f0da02371ddf0a46c3166ec9228a3f7a8e7603b6)
|
||||
* style(hover): added hover color [View](https://bitbucket.org/projects/test/repos/my-project/commits/c3b9ddfb7221c5cba0ab9997fc715096d29df72d)
|
||||
* Modify input's style [View](https://bitbucket.org/projects/test/repos/my-project/commits/7e4feb9350d39880d42505d6a80159d05a49f5f2)
|
||||
* Fix password css object [View](https://bitbucket.org/projects/test/repos/my-project/commits/ecbf7878569c519c41b96001ca2198212f13a5c3)
|
||||
* modifications sur les liens & les buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/435a1d58c90acdd6b373919387558de65bd922c3)
|
||||
* Personalize p html balise [View](https://bitbucket.org/projects/test/repos/my-project/commits/b0ca964c7558c6589aa3cd9d4c4b543a07b9e48c)
|
||||
* added list of elements [View](https://bitbucket.org/projects/test/repos/my-project/commits/8ac8b696aad5bf0358fdd06cbcdc8a6fea718979)
|
||||
* worked a bit on display [View](https://bitbucket.org/projects/test/repos/my-project/commits/93b9908a407999324b50d85619cb185266fbebb0)
|
||||
* worked on home [View](https://bitbucket.org/projects/test/repos/my-project/commits/807b6bc66020c279c4e7296d718579d6837bd671)
|
||||
* added delete buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/c64f6b9ebe17554c500224784417471fb0f93ce5)
|
||||
* added useful classes and comments [View](https://bitbucket.org/projects/test/repos/my-project/commits/58835864d32061c0d1e4c2da8cd00a98561f5b9f)
|
||||
* corrected links background [View](https://bitbucket.org/projects/test/repos/my-project/commits/fcc770f82de0b47a81c8c74cdbd029e82f58005c)
|
||||
* Add img [View](https://bitbucket.org/projects/test/repos/my-project/commits/00e3f00c9adecf6f93d8c3259b7cf71db3fe347a)
|
||||
* select modify [View](https://bitbucket.org/projects/test/repos/my-project/commits/ccf37a85362d9f3a226d0a8e3721702a616ec2c0)
|
||||
* minimal commit [View](https://bitbucket.org/projects/test/repos/my-project/commits/5f796b817a60eee9a7fc609cf00e73959e63209e)
|
||||
* Add dropdown arrow [View](https://bitbucket.org/projects/test/repos/my-project/commits/2e1078c4e437372a8e5705709260cbb76e6264ac)
|
||||
* :zap: format html, :alien: up translate file [View](https://bitbucket.org/projects/test/repos/my-project/commits/320c9504677d521a4011ec4f88c680b1b7177667)
|
||||
* :zap: add pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/018b1ce83eb84a74bafc35bc48fc3404338c384c)
|
||||
* Change colors [View](https://bitbucket.org/projects/test/repos/my-project/commits/9996d954dd5adafd3951e2357ae35fad6f99784e)
|
||||
* Add input borders [View](https://bitbucket.org/projects/test/repos/my-project/commits/1d6f1dc95580fb8432af93290b731c1e107ecea7)
|
||||
* delete left border on textarea [View](https://bitbucket.org/projects/test/repos/my-project/commits/b763252d765360da96f29c827258b76e100be567)
|
||||
* Change png to svg select image [View](https://bitbucket.org/projects/test/repos/my-project/commits/b091a190cf24785e78bce31086ce7f09aa527c64)
|
||||
* change select padding [View](https://bitbucket.org/projects/test/repos/my-project/commits/bddc200cbdc44e0266eaa018c0d9f9a0dff5e8e0)
|
||||
* change select padding [View](https://bitbucket.org/projects/test/repos/my-project/commits/e00dff4acb1a09f759779656af0a80e5d5e72718)
|
||||
* remove placeholder [View](https://bitbucket.org/projects/test/repos/my-project/commits/ba4fad8a31660e5c0a761e7507d9ff7a6f858a0b)
|
||||
* change home order text [View](https://bitbucket.org/projects/test/repos/my-project/commits/48e77024d54edfa950ed1cc89eab4110c830b8ff)
|
||||
* added flex-line [View](https://bitbucket.org/projects/test/repos/my-project/commits/cb6979926d282129cee11c56b352e46a97c58f14)
|
||||
* added wrap to flex-line [View](https://bitbucket.org/projects/test/repos/my-project/commits/ef9a0fe7704a18da5c5b4e75ee0839b53e6e70c3)
|
||||
* changed content width [View](https://bitbucket.org/projects/test/repos/my-project/commits/53a550bdc1ce33f691bffa0cd40a579142dcea05)
|
||||
* Change button style on home [View](https://bitbucket.org/projects/test/repos/my-project/commits/3be3bb44f1886e72a828662d267c090a477a0627)
|
||||
* style answers page [View](https://bitbucket.org/projects/test/repos/my-project/commits/e0898ba3945b8617609bc1a1a24646e27d1713ee)
|
||||
* add button [View](https://bitbucket.org/projects/test/repos/my-project/commits/132a7fabd3c089b84dd237d37c9902996d1f2427)
|
||||
* Testing [View](https://bitbucket.org/projects/test/repos/my-project/commits/df859e02818f2ffe2b2e9340eae725d540fa0e23)
|
||||
* :ambulance: change form-container to home component [View](https://bitbucket.org/projects/test/repos/my-project/commits/d2478c37a48bac56af35d0b91311a99bdd946913)
|
||||
* :zap: all page components do extend basecomponent and its common config service [View](https://bitbucket.org/projects/test/repos/my-project/commits/8f8a258ecf65d8af5307acf5ed8d2b543c835aae)
|
||||
* change link [View](https://bitbucket.org/projects/test/repos/my-project/commits/326f2731ff9caf811cab32062998cc62a6c116b6)
|
||||
* merge with ng-init [View](https://bitbucket.org/projects/test/repos/my-project/commits/193468e66995309adf480db0c6cbbf4113c96bc2)
|
||||
* Remove placeholder [View](https://bitbucket.org/projects/test/repos/my-project/commits/aab6ea801b81ee0aa8368483a2f15070ea574cf9)
|
||||
* :alien: demo for i18n [View](https://bitbucket.org/projects/test/repos/my-project/commits/cc7b4661eefc6674e4e5b849b3b6cda2eb67bbe7)
|
||||
* modify create or retrive page [View](https://bitbucket.org/projects/test/repos/my-project/commits/0c0dd7063dd7a47e1440366dd7b976e3e75e169d)
|
||||
* stylise button [View](https://bitbucket.org/projects/test/repos/my-project/commits/128e4b628185bcb00fe0de15abe2c9277b25f52f)
|
||||
* :alien: add ngx translate config [View](https://bitbucket.org/projects/test/repos/my-project/commits/d1ced70b1b81e2fa7cf8124bc9d6ee9cd76eeae5)
|
||||
* :alien: json strings to translate things in en/fr [View](https://bitbucket.org/projects/test/repos/my-project/commits/90323c28c7e96d1d3c70e54b8818d34680fc5783)
|
||||
* :alien: add missing translation support [View](https://bitbucket.org/projects/test/repos/my-project/commits/91101f2326413f9d63476c026c0207f93cb3e490)
|
||||
* :alien: translate 2 first pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/0f2a72f8720220fd17db37006b5361b425975006)
|
||||
* Add html code for voting [View](https://bitbucket.org/projects/test/repos/my-project/commits/6cc09aebb5f175d09862228799735aeed1ac1c85)
|
||||
* Add css on vote component : No works [View](https://bitbucket.org/projects/test/repos/my-project/commits/e059d45f73b5ee16925260139bdf066a3ac1b4d0)
|
||||
* Minimal commit [View](https://bitbucket.org/projects/test/repos/my-project/commits/9c4fabb176e78f28b72439d6e4f5ee138f404069)
|
||||
* :zap: choice component JS logic and type constraints. demo for dev environment [View](https://bitbucket.org/projects/test/repos/my-project/commits/f48d05b5188df06e3e4494510cb6f780d6b8c982)
|
||||
* :bug: fix undefined choice [View](https://bitbucket.org/projects/test/repos/my-project/commits/1074d219dd9dc5c267976806270dd6a2c51ed4ea)
|
||||
* :zap: date en français dans le choix de vote [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d060f99055acb3d5251b1afde70abc786768f51)
|
||||
* Add round to buttons on vote-choice [View](https://bitbucket.org/projects/test/repos/my-project/commits/1b9c669ae3d16d8fcaaa6977d558e420e7bdfc03)
|
||||
* Corrige center alignement [View](https://bitbucket.org/projects/test/repos/my-project/commits/36192647c01c47f1d6782da6c69297449c1f2d8b)
|
||||
* stylize the date [View](https://bitbucket.org/projects/test/repos/my-project/commits/8215dfab78f101bd15fcfaa0752afedc0b56842d)
|
||||
* Add `npm i` command to README.md [View](https://bitbucket.org/projects/test/repos/my-project/commits/fd27382a9aeaff8a6735a85712d4142f0b795976)
|
||||
* Modify vote component [View](https://bitbucket.org/projects/test/repos/my-project/commits/280783c56b699f72e736f31125cf4ab22c9d8c70)
|
||||
* Translation fr->en [View](https://bitbucket.org/projects/test/repos/my-project/commits/5e2193e8aa0aa5cea1fa1d20127142d84518ede6)
|
||||
* Correction of a typing mistake [View](https://bitbucket.org/projects/test/repos/my-project/commits/a63f76b45014c9dbb199406b30389b447bb09d60)
|
||||
* Put the words in a more natural order [View](https://bitbucket.org/projects/test/repos/my-project/commits/fd6cce277775a271aaab702e836dd93104d7e1be)
|
||||
* Add i18n in navigation [View](https://bitbucket.org/projects/test/repos/my-project/commits/0cb0813eb774c7aff4f96d71822dfa2d9e0cd089)
|
||||
* Stick "Frama" and "date" together [View](https://bitbucket.org/projects/test/repos/my-project/commits/efe0b892186b203dca49939573966eee10d1d772)
|
||||
* Minimal commit [View](https://bitbucket.org/projects/test/repos/my-project/commits/c671a8bdea289d1623502d5672069897556af3ab)
|
||||
* Replaced text by i18n json keys and add i18n attribute [View](https://bitbucket.org/projects/test/repos/my-project/commits/c5021a2aa1ff176457852f5419aa76e58dff2fa6)
|
||||
* Align elements [View](https://bitbucket.org/projects/test/repos/my-project/commits/69802a99ffa5e5a23e94f6b1f1d6931c9bfc62aa)
|
||||
* [front] global : update button styles [View](https://bitbucket.org/projects/test/repos/my-project/commits/802f54b930125db6c8994f53c1389d3892e0b91a)
|
||||
* [front] global : increase main wrap size [View](https://bitbucket.org/projects/test/repos/my-project/commits/a176405dd492ca9941d5b02011436db0e3f2076e)
|
||||
* [front] component : vote choice [View](https://bitbucket.org/projects/test/repos/my-project/commits/3e29117ea62ee3025ed1e3ae8b328aa51197dc3e)
|
||||
* ajout composant graphique sondage [View](https://bitbucket.org/projects/test/repos/my-project/commits/a006e4d42a0bd1bb85361952f47c27aa5ca3307d)
|
||||
* #36 : ajout librairie chartjs [View](https://bitbucket.org/projects/test/repos/my-project/commits/46a02846bfd0a49066cb03fcce04c1f239df5a8a)
|
||||
* issue 36 : select daltonien [View](https://bitbucket.org/projects/test/repos/my-project/commits/5f2a2b4461f6a4b8a33b6d64af4180f7e1ff85de)
|
||||
* Issue-30: Markdown support [View](https://bitbucket.org/projects/test/repos/my-project/commits/be96384a8e5f42211303b5f9215512787e9bb7cd)
|
||||
* [front] component : vote choice [View](https://bitbucket.org/projects/test/repos/my-project/commits/6ee9f742faa27b039785290660563bce998fe52b)
|
||||
* Issue-30 : markdown - bouton retour [View](https://bitbucket.org/projects/test/repos/my-project/commits/ca3b76d0c82dffa5c4f8f4228ef0579da7642500)
|
||||
* Format html templates with tabs [View](https://bitbucket.org/projects/test/repos/my-project/commits/bfa44534aa0ccc821a5d5f73d40a967dbc45ebab)
|
||||
* [fix] vote choice : minor css fixes [View](https://bitbucket.org/projects/test/repos/my-project/commits/28b3334d3e258f3cef1a36c3247aa6f89b37e8a4)
|
||||
* [front] vote choice : add image and text cases [View](https://bitbucket.org/projects/test/repos/my-project/commits/6f8b180d1fdb50f10804025e6232fbe512cf680f)
|
||||
* suppression du code mort [View](https://bitbucket.org/projects/test/repos/my-project/commits/f9a8c1d8c3f92099b2d29723a5337402a0bc6d05)
|
||||
* Resolution du conflit [View](https://bitbucket.org/projects/test/repos/my-project/commits/985be95b0d16529196891d4c855c46bfad53c575)
|
||||
* Conflit resolved [View](https://bitbucket.org/projects/test/repos/my-project/commits/8b728d172f1558f603bc8f11df0d97f737020772)
|
||||
* Traduction placeholder [View](https://bitbucket.org/projects/test/repos/my-project/commits/61d31dfd5a252f7e89ad464c51d675d78b0812d5)
|
||||
* Err correction special dates [View](https://bitbucket.org/projects/test/repos/my-project/commits/22a560d82d40337bd66ab30062ca235a7e3e99ca)
|
||||
* issue-36 : restitution des votes d'un sondage sous forme de graphiques. début [View](https://bitbucket.org/projects/test/repos/my-project/commits/00597410277aa3c387a8b33d9e31033adc853fc9)
|
||||
* :zap: choices to add,clear and delete [View](https://bitbucket.org/projects/test/repos/my-project/commits/b7afca96db4b811fa02e1f4725dc6f5661f1db0e)
|
||||
* Issue-36 : Graph sondage [View](https://bitbucket.org/projects/test/repos/my-project/commits/723a0f9527776f1de653464b979980c662a6e909)
|
||||
* Fix bug [View](https://bitbucket.org/projects/test/repos/my-project/commits/497cf9e12ca5ef283391b9586d83f1ca2daf13dd)
|
||||
* fix bug [View](https://bitbucket.org/projects/test/repos/my-project/commits/1055a0cdbe3f800acccc6a8f06c3669f47ef6de7)
|
||||
* Une partie de html [View](https://bitbucket.org/projects/test/repos/my-project/commits/942649656df42aa23f0117ed8757bb3e176129b8)
|
||||
* :bug: fix focus on date, extend the empty all button to timespans [View](https://bitbucket.org/projects/test/repos/my-project/commits/cf2a12507e053d9235d6a03f1e0569c90df82c27)
|
||||
* Ajout formatage données [View](https://bitbucket.org/projects/test/repos/my-project/commits/c36a3b064cc1330628037c57ffff9cf5c41c183c)
|
||||
* :bug: fix deletions in date buttons , input of type date [View](https://bitbucket.org/projects/test/repos/my-project/commits/933c32798cc26461ca5b62ec3eb89c18f29e4953)
|
||||
* :zap: start call backend service to retrieve my polls by email [View](https://bitbucket.org/projects/test/repos/my-project/commits/026c7cfda2476e7a77cecfaff28c151e835b7a10)
|
||||
* :alien: translate button to add [View](https://bitbucket.org/projects/test/repos/my-project/commits/6a40e041d0af462d9e776632168d033ab2d7eae2)
|
||||
* :alien: translate button to add in template [View](https://bitbucket.org/projects/test/repos/my-project/commits/20876f9a8d927fadc083b193d671355f4bfd3423)
|
||||
* :zap: add unique interval days [View](https://bitbucket.org/projects/test/repos/my-project/commits/572f0837cc93feba5ee76a6b112a14d333ba6121)
|
||||
* :alien: translate buttons [View](https://bitbucket.org/projects/test/repos/my-project/commits/7b590840b2a8504db34114434fd2345141711f4d)
|
||||
* :zap: fix function call in template [View](https://bitbucket.org/projects/test/repos/my-project/commits/e81389eae13b8709085710ce60bae6d3307ba7ae)
|
||||
* :zap: link graphic in nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/c0f800ff91822255a4d84e18106d238506dfaab4)
|
||||
* Page crée et bien complétée (plus qu'a faire les alignements) [View](https://bitbucket.org/projects/test/repos/my-project/commits/84b87486ed57d14549f6a5bc5c00df508cad7ed1)
|
||||
* Presque fini [View](https://bitbucket.org/projects/test/repos/my-project/commits/8f8a0d07d27a23f0871f1718ca5e0654bb1f38db)
|
||||
* Dernier commit avant merge [View](https://bitbucket.org/projects/test/repos/my-project/commits/39d4213bded6915081dd42cd506c52ff20ac2659)
|
||||
* Resolve a part of merge conflicts [View](https://bitbucket.org/projects/test/repos/my-project/commits/275a065d8ebde70d9556ad1c2e915daf6228578b)
|
||||
* :zap: svg in assets [View](https://bitbucket.org/projects/test/repos/my-project/commits/d993111d34afa7f33a56c95823e2ca159a8350f1)
|
||||
* :alien: translation keys for visibility page [View](https://bitbucket.org/projects/test/repos/my-project/commits/7a9c7b6dc3d5f63282fe48e8dd9b1979cca38463)
|
||||
* start visibility [View](https://bitbucket.org/projects/test/repos/my-project/commits/8ff8cbc40838ac3ffb41643804ca3aa976adc4c8)
|
||||
* :zap: selector custom component for ui, half the visibility page [View](https://bitbucket.org/projects/test/repos/my-project/commits/d107978f2c66dfa80abb47ddc2cce107f8a5eec1)
|
||||
* end visibilty fields link with poll config [View](https://bitbucket.org/projects/test/repos/my-project/commits/f4108ee61b31fe555775a05dbebba49ed78d722f)
|
||||
* :zap: link default values [View](https://bitbucket.org/projects/test/repos/my-project/commits/c1935dbb87b53b4750c798dee79506cc215ac1dd)
|
||||
* :zap: linked things [View](https://bitbucket.org/projects/test/repos/my-project/commits/7da480f310359c4d29a030654582cbadf68d26ce)
|
||||
* :art: style remove strange section sizes, h1 size greater [View](https://bitbucket.org/projects/test/repos/my-project/commits/93f3aa76bd7aced66d936967c7f7fb90b2d800cd)
|
||||
* add default content to poll config [View](https://bitbucket.org/projects/test/repos/my-project/commits/e179be812eda262fb103c67b721f35f7c95010fa)
|
||||
* :zap: enhance keyboard navigation with answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/9c02b1ae2b16abd5ef43f41721a2657369fedc28)
|
||||
* :alien: add english key to translate [View](https://bitbucket.org/projects/test/repos/my-project/commits/48586b847507e93f0c93c084364523d2bef94e73)
|
||||
* changer la langue entre fr et en quand on clique sur l'icone de traduction [View](https://bitbucket.org/projects/test/repos/my-project/commits/b78ea6273eadfa9ea862952fdd4ed32b72a9191e)
|
||||
* Translation work [View](https://bitbucket.org/projects/test/repos/my-project/commits/abe07bc9784cce5aa93ffa2831ca18abc8e8c046)
|
||||
* HTML Part [View](https://bitbucket.org/projects/test/repos/my-project/commits/c581d7262500778c7fab1d63323f74437a6e0665)
|
||||
* Complete HTML [View](https://bitbucket.org/projects/test/repos/my-project/commits/a53322b441be5cdf882777e92909205e91008445)
|
||||
* CSS Part [View](https://bitbucket.org/projects/test/repos/my-project/commits/3e372d6f53b7dc8e06d26bc8295663505f958def)
|
||||
* Other css part [View](https://bitbucket.org/projects/test/repos/my-project/commits/07f5d60b95e87c5393061a2c443a8d4f3b66e285)
|
||||
* :zap: start backend calls [View](https://bitbucket.org/projects/test/repos/my-project/commits/f223b760fff0cfc769396891f5528fc97b55099d)
|
||||
* organise calls, add headers [View](https://bitbucket.org/projects/test/repos/my-project/commits/cb6636f1557cdf4e33f0a2163245f6ab5ae63755)
|
||||
* push [View](https://bitbucket.org/projects/test/repos/my-project/commits/d3a7a37d4db51e2aaddae9180c7c4d6dc8413444)
|
||||
* Spelling corrections [View](https://bitbucket.org/projects/test/repos/my-project/commits/6f08fc3dd05203babedf7d15c8c9fe09b9b0eca7)
|
||||
* 🎉🎉 Page terminée 🎉🎉 [View](https://bitbucket.org/projects/test/repos/my-project/commits/73b9d496e68db9c0bdb49e1f53fc3a25129c97eb)
|
||||
* Plus qu'a aligner les labels aux inputs [View](https://bitbucket.org/projects/test/repos/my-project/commits/be66cc0a907fc1e947d5c02e85ff1e6388eec0a1)
|
||||
* Terminé [View](https://bitbucket.org/projects/test/repos/my-project/commits/2b079f63a043e3bd2dda486ca8e1005b72535c6a)
|
||||
* Add route and HTML [View](https://bitbucket.org/projects/test/repos/my-project/commits/adcdaf911f99567bb348accd1197a6f013939bca)
|
||||
* Add css [View](https://bitbucket.org/projects/test/repos/my-project/commits/c727aa935e509e061b0dba669e41c82bc6791e63)
|
||||
* :art: style on current page from the route data, and texts in the confirm page, step end [View](https://bitbucket.org/projects/test/repos/my-project/commits/809aa0f02fc0add44b497a4ba8ee55c6ee17fc6c)
|
||||
* :zap: link to public [View](https://bitbucket.org/projects/test/repos/my-project/commits/112119194a1255b6c96e82476dc7e08123b1b835)
|
||||
* :zap: remove debug step in nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/daf7006bb8317b4ec6ed96e0a28ef93d8de9ba39)
|
||||
* :zap: fix some deps [View](https://bitbucket.org/projects/test/repos/my-project/commits/cf4e9f45634b0eb8fa52bf77c52373876ce5eaef)
|
||||
* :zap: update dependencies with yarn, add primefaces to make toasts [View](https://bitbucket.org/projects/test/repos/my-project/commits/ded5e71e73a037096d0497b615faf82d733a775b)
|
||||
* :art: add font awesome [View](https://bitbucket.org/projects/test/repos/my-project/commits/4296c5c9f95c2dae7754c4a6ba1751444b9ff039)
|
||||
* :zap: get poll data in vote choices [View](https://bitbucket.org/projects/test/repos/my-project/commits/5657f57fc75b05c055c63798032c8eae0514a0e0)
|
||||
* :zap: reorganize poll display page [View](https://bitbucket.org/projects/test/repos/my-project/commits/79ef34e5af971db537f42cb0c4eacd6bd79f00e0)
|
||||
* merge with dev [View](https://bitbucket.org/projects/test/repos/my-project/commits/c9b4ffe328ec283b2630406c788dab70b45c8505)
|
||||
* :zap: enhance display poll page [View](https://bitbucket.org/projects/test/repos/my-project/commits/52587428ddcbe179c71892f9288a44202306fb0a)
|
||||
* :zap: reorganize poll display page and urls in config [View](https://bitbucket.org/projects/test/repos/my-project/commits/051e4d8ee469370a7ae7b68cce6a1325394b9c12)
|
||||
* :zap: change translation button way to be in sync with the model [View](https://bitbucket.org/projects/test/repos/my-project/commits/37904596fbc2f68e2fa6d80d44422b4230af71d8)
|
||||
* :art: visual help on clickable elements [View](https://bitbucket.org/projects/test/repos/my-project/commits/5eba5d684b7c8b6194ac1676b4559d189792ec44)
|
||||
* :zap: check for uniqueness of the slug, slug the title by default [View](https://bitbucket.org/projects/test/repos/my-project/commits/2720b6596241874df330373645952f6a53ebeb5c)
|
||||
* :zap: add email to creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/7c64f1f8f08b75fb34ddd7459d8e9580202e5298)
|
||||
* :zap: copy to clipboard ok [View](https://bitbucket.org/projects/test/repos/my-project/commits/4098f7ec5c533d3b35e629278006d6134ff8ee38)
|
||||
* :zap: toast messages when copied to clipboard and network errors [View](https://bitbucket.org/projects/test/repos/my-project/commits/b44f2719b44e4aba7476dc7952b4cc739b9d1d39)
|
||||
* :book: clean console logs [View](https://bitbucket.org/projects/test/repos/my-project/commits/7df60e5a514783a5d393e9a3446a934e12e580ea)
|
||||
* :bug: fix show and hide of password input [View](https://bitbucket.org/projects/test/repos/my-project/commits/fd4bbb5c712fb79204badae316d92fd17be7c9e5)
|
||||
* :zap: calls in administration page to delete things [View](https://bitbucket.org/projects/test/repos/my-project/commits/bae3f19af223022c933fd622d3c8adf2bf6167db)
|
||||
* :bug: remove duplicate text in end of admin page [View](https://bitbucket.org/projects/test/repos/my-project/commits/113609e945f5e09ae3c04119225eb6bd7fa670c8)
|
||||
* :zap: toast todo things [View](https://bitbucket.org/projects/test/repos/my-project/commits/7b790e3cdc58ee296e16645abef0fc9ee0cad629)
|
||||
* :zap: computations for the result graph [View](https://bitbucket.org/projects/test/repos/my-project/commits/1b65d58a6f52acfb0265c33de7c9779177b73ff1)
|
||||
* toggle simple answer [View](https://bitbucket.org/projects/test/repos/my-project/commits/a3e243ed19bddc12e194a166ab38c3101835fcc2)
|
||||
* :bug: fix build [View](https://bitbucket.org/projects/test/repos/my-project/commits/10497c9cb09873f3ede8b75729d2f444d12e5338)
|
||||
* :zap: add update demo script, remove duplicate toast, try hash route [View](https://bitbucket.org/projects/test/repos/my-project/commits/6a3d2c3195303b5094f43102df78f7e4990e19c8)
|
||||
* :zap: modal to display url [View](https://bitbucket.org/projects/test/repos/my-project/commits/255205696bcf8778088404348bdd0b748649f0b3)
|
||||
* :zap: list mypolls on first page [View](https://bitbucket.org/projects/test/repos/my-project/commits/9ebd22536b1ed314e264757867d84bef1ee87d9f)
|
||||
* buttons to nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/3808f194258dd5cd93b03258ec2f2d90ee6b615b)
|
||||
* :zap: erasable inputs on first config screen ok [View](https://bitbucket.org/projects/test/repos/my-project/commits/3ada66ac5f36c38502556f18982954d2526cce0e)
|
||||
* launch creation from resume page [View](https://bitbucket.org/projects/test/repos/my-project/commits/f8568eb9102668521556b40eacc89ee8b639db09)
|
||||
* :zap: lang input placement [View](https://bitbucket.org/projects/test/repos/my-project/commits/ff5c11e79c42926296516f27cc95aa660e34a50d)
|
||||
* :zap: really fetch a poll by id [View](https://bitbucket.org/projects/test/repos/my-project/commits/123a0b1c809999306f131e6e0f9523d82944d38a)
|
||||
* :zap: update vote list after vote creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/06cf447529583f05789e17f9d9b9d196f0a56409)
|
||||
* :zap: hop [View](https://bitbucket.org/projects/test/repos/my-project/commits/96709c9bc71980541497eb7f4387512948f3de08)
|
||||
* :book: add mocks from updated backend [View](https://bitbucket.org/projects/test/repos/my-project/commits/a68cbdcc0a017e30490239ff9593c69b7b2f798f)
|
||||
* :bug: fix recursion in input erase button [View](https://bitbucket.org/projects/test/repos/my-project/commits/195259bb722a4dd5260a05bbe5dd77cbc6d0577e)
|
||||
* :zap: menu to nav on poll display - #64 [View](https://bitbucket.org/projects/test/repos/my-project/commits/d2c726012bbc4cf413b18f454fc9e859fdb50b49)
|
||||
* :zap: build for production, :bug: fix publicy of vars in templates [View](https://bitbucket.org/projects/test/repos/my-project/commits/ea43430e1b7acf3f6250215fc9966cca5e6422a5)
|
||||
* :zap: build for demo updated [View](https://bitbucket.org/projects/test/repos/my-project/commits/f96833d96e7c53dd855113ef9e3a7dd7b62c5021)
|
||||
* :zap: use hash for internal routing in the frontend [View](https://bitbucket.org/projects/test/repos/my-project/commits/b06a44fb98ec9d0f3903b99f917aff7817742983)
|
||||
* poll routing hints in the app, demo precision in header [View](https://bitbucket.org/projects/test/repos/my-project/commits/8322a9a83a799e67b90dd47e0aa4ff1c56b81e0b)
|
||||
* :zap: other url to create a poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/9900e1ec976dd98fcb63bc35ed6f286caa8c427c)
|
||||
* sync fetch stuff [View](https://bitbucket.org/projects/test/repos/my-project/commits/02995c8b3d40eb7b05361c8ecf9e59a706a0fd51)
|
||||
* :zap: mock for poll 1, fix new comment [View](https://bitbucket.org/projects/test/repos/my-project/commits/346bd9dc4f69296c51550f0da1b7e40a632051a7)
|
||||
* stuff [View](https://bitbucket.org/projects/test/repos/my-project/commits/7e4e80f1ed3843eb8724e93d46c1d7fc598dcdd1)
|
||||
* :bug: fix fetch of old params [View](https://bitbucket.org/projects/test/repos/my-project/commits/01bddc842db7b91ed2e5ebe4db036ba709dae3f4)
|
||||
* :zap: add administration key after creation [View](https://bitbucket.org/projects/test/repos/my-project/commits/7bc53e198d8dc9fdae172bd596647a6b2ca1ad6f)
|
||||
* :zap: choices lighter and work [View](https://bitbucket.org/projects/test/repos/my-project/commits/22bd836a16187607ee3be22cad867c7f7e2e729b)
|
||||
* step to date form [View](https://bitbucket.org/projects/test/repos/my-project/commits/2e6723a1f1121c47bf9e6fb00cc043f987394940)
|
||||
* fix buttons colours and manage a bit more the date form [View](https://bitbucket.org/projects/test/repos/my-project/commits/f056b0d79a2a5c894cc91d3723d16244c4abb58d)
|
||||
* button to act on time [View](https://bitbucket.org/projects/test/repos/my-project/commits/a66933041f46dbaa2a15d373fd1809c82607dff3)
|
||||
* change preview for dates type [View](https://bitbucket.org/projects/test/repos/my-project/commits/460e236d604beb1c24b4beaa5a1d992eb5b45dab)
|
||||
* date accessor [View](https://bitbucket.org/projects/test/repos/my-project/commits/22736f709e36463e9e470e9a3385d246c85fd85f)
|
||||
* :bug: handle no current poll [View](https://bitbucket.org/projects/test/repos/my-project/commits/f9d1cfff3a8f0f8d17ce622f21bc74fa9aa66aac)
|
||||
* :bug: fix some config keys [View](https://bitbucket.org/projects/test/repos/my-project/commits/100569515328df6988c250f87e12124e9034227e)
|
||||
* :zap: manage interval of date with date objects [View](https://bitbucket.org/projects/test/repos/my-project/commits/e227344647501e02bb3ed56da2e239e5c9e2a06a)
|
||||
* :zap: disabled button when nothing is selected, detect counts [View](https://bitbucket.org/projects/test/repos/my-project/commits/0369d934bddc852e71d7a671ec41765b1a80990c)
|
||||
* display a table of answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/43ea524c2604891095940da3827ecd7c0003a10b)
|
||||
* :bug: fix visibility of config in summary [View](https://bitbucket.org/projects/test/repos/my-project/commits/f976d65d204183c3c9f5d1d606edcf97bf6db311)
|
||||
* :zap: update current answers with a previous vote [View](https://bitbucket.org/projects/test/repos/my-project/commits/9cf368f5504c1dcd28d34f9682888c65202bda6f)
|
||||
* sort table of answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/ca69160ea979c2995a2e5cdc2b825bb05e293fa2)
|
||||
* :zap: show preferred texts in summary, icons for votes [View](https://bitbucket.org/projects/test/repos/my-project/commits/0e8d18cd8000b2b9a9fb3d74277bf24a26c8b380)
|
||||
* :zap: add bulma framework, style table [View](https://bitbucket.org/projects/test/repos/my-project/commits/74ade7ac0fe52d48bec50522b648b5e0bac27d1e)
|
||||
* fix select visibility [View](https://bitbucket.org/projects/test/repos/my-project/commits/bc67f26327186ef6ff9a476824eae987f3b83532)
|
||||
* :zap: component to copy text to clipboard [View](https://bitbucket.org/projects/test/repos/my-project/commits/63e1a5e899cd6681ce819c53669a76b7987fb7a2)
|
||||
* :zap: unify update config after fetching a poll config [View](https://bitbucket.org/projects/test/repos/my-project/commits/dd9e8950f4473dd39841ba3150bff23b8f172016)
|
||||
* :fix: load vote of someone else ok [View](https://bitbucket.org/projects/test/repos/my-project/commits/b1adfaa8ea565cc6204ef975d5153ba99fc66e75)
|
||||
* :zap: reset all answers before loading a stack [View](https://bitbucket.org/projects/test/repos/my-project/commits/4bcd3e475f9c7f31b5b4f8f5ffe700239929660c)
|
||||
* export data in csv with rows and comments [View](https://bitbucket.org/projects/test/repos/my-project/commits/e3e5cf6638b2522c2bc7ac7181d63a6f3683e502)
|
||||
* :zap: split poll display components [View](https://bitbucket.org/projects/test/repos/my-project/commits/ab23b9b2566cbd328bf9a510202c39fcd046634c)
|
||||
* :gears: refacto date and poll utilities functions in a separate class [View](https://bitbucket.org/projects/test/repos/my-project/commits/c5b52764002149eff41dcd48cb876fa6ec79d562)
|
||||
* :book: update refacto utilities as services [View](https://bitbucket.org/projects/test/repos/my-project/commits/44424d378aef95bb0bfc014104b5346c340ad5c7)
|
||||
* :hammer: test voting choice, add ci pipeline config [View](https://bitbucket.org/projects/test/repos/my-project/commits/0a3ee9b6f0c145ed069eb07f554f20f4f294cff4)
|
||||
* :zap: update package lock for CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/91b1d64f0a6282fcbebd46aab328988e75be2620)
|
||||
* :bug: run test in single run mode on CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/a088daf4a3a1870a82c300e66d1463b0be909f5e)
|
||||
* run build for prod on CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/b360720e1504af9b220d579ee2b01668255c6b7d)
|
||||
* :gears: update ng cli 8 [View](https://bitbucket.org/projects/test/repos/my-project/commits/8f59e654477a5b2ccea0748b59720ccb8137919e)
|
||||
* :hammer: update to angular v 9 [View](https://bitbucket.org/projects/test/repos/my-project/commits/38d1d52633a3e0fb8d68433edb985754861aaf2b)
|
||||
* :zap: custom date value accessor with renderer 2 [View](https://bitbucket.org/projects/test/repos/my-project/commits/1816150c6d06c51ab83cc77ebebff7ff70cc002f)
|
||||
* :hammer: test with FirefoxHeadless for gitlab CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/e089d19993613619c0585556f5cdc6265154a0cb)
|
||||
* :zap: manage dates poll type display, fix typo in add button date [View](https://bitbucket.org/projects/test/repos/my-project/commits/15bbf0e375309a8e273c4a5b9aa0bc70cd5cdc6e)
|
||||
* dates and recap side to side [View](https://bitbucket.org/projects/test/repos/my-project/commits/61bf6a289c44cac419d60e186f18594b21f1b4e8)
|
||||
* :zap: ad storybook [View](https://bitbucket.org/projects/test/repos/my-project/commits/4ec9b174ad295f5cee76e515ed70b88313f6476e)
|
||||
* :zap: add some types interfaces in the config [View](https://bitbucket.org/projects/test/repos/my-project/commits/49b79395644d792ac633a0df5d15da07e0c460a3)
|
||||
* :book: add compodoc [View](https://bitbucket.org/projects/test/repos/my-project/commits/d7a2a8d6b78f7ea920fd794139f7f3d0d6dddd51)
|
||||
* :bug: fix synced time slices [View](https://bitbucket.org/projects/test/repos/my-project/commits/ff8e02b2154d81a62a7f979dcfcc83c826a79295)
|
||||
* :fix: remove puckage lock in profit of yarn [View](https://bitbucket.org/projects/test/repos/my-project/commits/ba7465fe8395c26e0d2bb6ae8fcab10d179a2497)
|
||||
* :bug: add package only for CI [View](https://bitbucket.org/projects/test/repos/my-project/commits/e03359e8db170647a5534e376803a9d6e0a10ddd)
|
||||
* :zap: component to select theme [View](https://bitbucket.org/projects/test/repos/my-project/commits/2d757c6726a942237c3bad27258e1820bce1e5d0)
|
||||
* :art: better disposal for theme selector [View](https://bitbucket.org/projects/test/repos/my-project/commits/312b2d859943900a8784d0fbdc1cc03db0ab2be4)
|
||||
* :hammer: fix for CI, bad option in npm run test [View](https://bitbucket.org/projects/test/repos/my-project/commits/a0138f84d3b01e276909a934d176a375e22529b1)
|
||||
* :zap: add confirmation modal for admin user, issue #59 [View](https://bitbucket.org/projects/test/repos/my-project/commits/c0a4ec7a0c143263ed84b494ca30fcce3dc27e00)
|
||||
* :bug: fix update after vote #65 [View](https://bitbucket.org/projects/test/repos/my-project/commits/75c26572fe0fcc9b305c51d10a39bd1d3fba6f43)
|
||||
* :zap: can or can not modify votes issue #49 [View](https://bitbucket.org/projects/test/repos/my-project/commits/fff4e57378d9a49211a684f64433870fd67b3441)
|
||||
* :zap: fix issue of selecting can or can not modify answers [View](https://bitbucket.org/projects/test/repos/my-project/commits/23dc45f1986fd8b3c06af7ba02a192737c04c3a4)
|
||||
* :art: arrange create or retrieve page in two columns [View](https://bitbucket.org/projects/test/repos/my-project/commits/60c184c60ba389e8ebd1b40d6ac0d51488fe66b6)
|
||||
* split many components, presentation with left nav [View](https://bitbucket.org/projects/test/repos/my-project/commits/9bdd4e0084d8c4fedf45453b947348cf55ad7416)
|
||||
* :hammer: fix linting, add env default [View](https://bitbucket.org/projects/test/repos/my-project/commits/6e6b812d2d5271221d65b7d3d8c2705e134e2683)
|
||||
* :zap: theme persisted in the localstorage, reload config on page reload - issue #75 [View](https://bitbucket.org/projects/test/repos/my-project/commits/936110846c4326d5772c89fbfad488b44aaa7651)
|
||||
* :zap: :alien: Conserver le choix de langue au rechargement de la page - issue #54 [View](https://bitbucket.org/projects/test/repos/my-project/commits/acb091802c51ee7d1fad0b0ae08597da87cf3c52)
|
||||
* :zap: export format json public [View](https://bitbucket.org/projects/test/repos/my-project/commits/e2c388da9e26e908ca278cde575ac9bff28926e4)
|
||||
* :zap: add eslint [View](https://bitbucket.org/projects/test/repos/my-project/commits/e56d5cdcef59bba41e0d37711f047b6f799e45fa)
|
||||
* - upgrade all packages - intall & configure linters (eslint, prettier, etc.) [View](https://bitbucket.org/projects/test/repos/my-project/commits/dd9bb8922f24cca7b33c34cb3bad1b190aebb91a)
|
||||
* reformat all files + move routes.ts to AppRoutingModule [View](https://bitbucket.org/projects/test/repos/my-project/commits/18a7d4781ac44f820b870269f5134b305758e722)
|
||||
* Jest tests [View](https://bitbucket.org/projects/test/repos/my-project/commits/ca5ffdc896864d47467b7562494c600b120f4d2b)
|
||||
* routing for admin ith token parameter, add comments [View](https://bitbucket.org/projects/test/repos/my-project/commits/15b10f938149cc5fb8af087f773188be3c722bfe)
|
||||
* :zap: admin route calling the backend [View](https://bitbucket.org/projects/test/repos/my-project/commits/8fa39250d5e5863c8987b3fc2e9464dc3bb61d7e)
|
||||
* refacto : create entities, enums, services [View](https://bitbucket.org/projects/test/repos/my-project/commits/e5243204572e2dcba735335f4861f36d72fd98a5)
|
||||
* :gears: move components to better semantic folders [View](https://bitbucket.org/projects/test/repos/my-project/commits/86ada008c505f6935e540023bb706cf9605588d9)
|
||||
* :zap: change theme enum to correspond with themes classnames [View](https://bitbucket.org/projects/test/repos/my-project/commits/60b4bfb6197318ca5bb6e21d8dfc031da7c5d070)
|
||||
* :zap: add component having a couple of configurable links, to navigate between pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/da7e96526c3ed95b395b33bdaee5347ea9837f6f)
|
||||
* Feature/simplify scss [View](https://bitbucket.org/projects/test/repos/my-project/commits/ba7a24708dd83cc99c81ebe064f5570fac369a38)
|
||||
* gitignore add eslintcache file [View](https://bitbucket.org/projects/test/repos/my-project/commits/985b9fcdcf17b35790e341318b1a109b3e454a79)
|
||||
* update env api endpoints [View](https://bitbucket.org/projects/test/repos/my-project/commits/23b8622a4f2b8d74e1b2d80319658ac70bcd2e21)
|
||||
* rebase branch 'feature/refacto_1' of https://framagit.org/framasoft/framadate/funky-framadate-front into feature/refacto_1 [View](https://bitbucket.org/projects/test/repos/my-project/commits/7a4f16e4845f74894bcbfd7344205f005c243b5e)
|
||||
* :bug: remove admin component request [View](https://bitbucket.org/projects/test/repos/my-project/commits/4ec9091233986af49d5c271b91bdbe33b18aaebe)
|
||||
* :bug: fix window variable in html [View](https://bitbucket.org/projects/test/repos/my-project/commits/48636ad9478e002da705bd96c330333cb3bb3fc9)
|
||||
* split config service & dispatch [View](https://bitbucket.org/projects/test/repos/my-project/commits/3997dd090e076bcd3f92562e231f118eb5cc731f)
|
||||
* upgrade archi with modules [View](https://bitbucket.org/projects/test/repos/my-project/commits/7029368ab1fc7f4ebbddcaca3d7140f4441d2873)
|
||||
* - replace date-fns by momentJS - install ng2-chart along with chart.js [View](https://bitbucket.org/projects/test/repos/my-project/commits/91be2a3048dbaa0179fa97f8cbc027d06b276f4a)
|
||||
* 👷 — Build and deploy on Gitlab pages [View](https://bitbucket.org/projects/test/repos/my-project/commits/f6753822183d63a53c908017740b0908a600f3cc)
|
||||
* 👷 — Try to deploy build on Gitlab page even if test fails [View](https://bitbucket.org/projects/test/repos/my-project/commits/f1cbf175a9c93681ffa0e438564cc76925e3c87a)
|
||||
* 👷 — Deploy build on Gitlab page before tests [View](https://bitbucket.org/projects/test/repos/my-project/commits/96354f6202c0de8892a7516658ea1a5e65a28615)
|
||||
* 👷 — Modify <base> tag in build’s index.html [View](https://bitbucket.org/projects/test/repos/my-project/commits/da854454aaee8390e9430def4674577b747433cb)
|
||||
* 👷 — Cleaner script for Gitlab page build [View](https://bitbucket.org/projects/test/repos/my-project/commits/645b25de790b43c19191545beecd4923a29b71eb)
|
||||
* [feat] :zap: add a floating button to give feedback [View](https://bitbucket.org/projects/test/repos/my-project/commits/442530983b8015a291ae34be78d78c9e061adf7d)
|
||||
* :style: style for feedback options, fixed floating button [View](https://bitbucket.org/projects/test/repos/my-project/commits/9057e890a408199eb96b6a6b7a92336a4b31582c)
|
||||
* default to hide menu [View](https://bitbucket.org/projects/test/repos/my-project/commits/93ea16127475cd7611b70684ea6ff2f6d90ce96e)
|
||||
* :zap: refacto feedback, :art: style for popup links, place icons before text [View](https://bitbucket.org/projects/test/repos/my-project/commits/cc27f31e0ecf08c5cae26068d19e1e715e921844)
|
||||
* :zap: styling themes [View](https://bitbucket.org/projects/test/repos/my-project/commits/23c6b9400ee2d2917e3f5e8cf3d327fd2a537747)
|
||||
* :book: add footer links, :art: set default theme to light, fix some details with black theme. [View](https://bitbucket.org/projects/test/repos/my-project/commits/a93a34a638ecca03dfc6466f0b347c9961cff18f)
|
||||
* :art: primary button, section to find back my polls on home [View](https://bitbucket.org/projects/test/repos/my-project/commits/b2a739016fbc39b69138127fe60de621698aa904)
|
||||
* add feedback button, load administration module from app module [View](https://bitbucket.org/projects/test/repos/my-project/commits/9c60f8a379fffea4574c86799c886aee37dd9968)
|
||||
* :zap: change branch name in update demo script [View](https://bitbucket.org/projects/test/repos/my-project/commits/a1de41699e4aeeb6149f2a93f8c98696ff952a40)
|
||||
* :zap: demo build script back to life [View](https://bitbucket.org/projects/test/repos/my-project/commits/4f0a29e806f9a87b97c7024487b195b3c90896eb)
|
||||
* add user settings button & modal [View](https://bitbucket.org/projects/test/repos/my-project/commits/355fed53f3dc45fc27245e5b13dcefadac774b87)
|
||||
* add json-server + refacto [View](https://bitbucket.org/projects/test/repos/my-project/commits/ae2974967048a6bbbba65df79591a1dcff970064)
|
||||
* clean refacto [View](https://bitbucket.org/projects/test/repos/my-project/commits/3125e86f0bdc1ab74cec9baeb273588afe92ca90)
|
||||
* replace primeng by material && improvments [View](https://bitbucket.org/projects/test/repos/my-project/commits/f9b847b305192506b2fc8109f187f6a45afeccd3)
|
||||
* add route resolver for lazy-loading [View](https://bitbucket.org/projects/test/repos/my-project/commits/63600c759ebbdba5473789b6b030fe8e33a767ae)
|
||||
* refacto routing [View](https://bitbucket.org/projects/test/repos/my-project/commits/a62e00c6adf4a0a62a617e0e5a9a054b6bfd6803)
|
||||
|
||||
|
@ -1,40 +0,0 @@
|
||||
# Pour débuter - getting started
|
||||
Clonez le dépot, installez les dépendances, et lancez le serveur local qui se recharge lorsque vous sauvegardez des fichiers dans le dépot.
|
||||
Les fois suivantes vous n'aurez qu'a lancer `yarn start`.
|
||||
|
||||
```bash
|
||||
# clonez le dépot
|
||||
git clone https://framagit.org/framasoft/framadate/funky-framadate-front.git
|
||||
cd funky-framadate-front
|
||||
|
||||
# install yarn
|
||||
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
|
||||
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
|
||||
sudo apt-get update && sudo apt-get install yarn
|
||||
|
||||
yarn install --pure-lockfile
|
||||
yarn start
|
||||
# et c'est parti, vous pouvez voir le site de développement http://localhost:4200
|
||||
```
|
||||
|
||||
Pour interagir avec la base de données, il vous faudra également faire démarrer l'API Symfony de backend dans l'autre dépot https://framagit.org/tykayn/date-poll-api ,
|
||||
qui se lance par défaut sur le port 8000 avec une simple commande (si vous avez installé le tout) `symfony serve`.
|
||||
|
||||
# Modifier les configurations par défaut
|
||||
|
||||
Les configurations par défaut les plus générales telles que le nom du site ou les adresses d'API sont importées dans les fichiers d'environnement:
|
||||
|
||||
[environment.ts par défaut](src/environments/environment.ts)
|
||||
|
||||
Les propriétés par défaut des objets sont dans les modèles:
|
||||
|
||||
[dossier des modèles](src/app/core/models)
|
||||
|
||||
Et c'est le service en charge de la persistence de ces configurations et du stockage local qui surchage les propriétés des modèles quand une personne revient sur le site
|
||||
|
||||
[storage.service.ts](src/app/core/services/storage.service.ts)
|
||||
|
||||
# Pas de config docker
|
||||
Nous n'avons pas actuellement de config docker qui solutionnerait tout ça, les merge request sont les bienvenues! :)
|
||||
|
||||
=> https://framagit.org/framasoft/framadate/funky-framadate-front
|
28
docs/TODO.md
@ -1,28 +0,0 @@
|
||||
# Todo - liste des choses à faire
|
||||
## Idées pour de futures améliorations (pertinence à vérifier)
|
||||
|
||||
* Gagner en vie privée en chiffrant certaines informations ? Stockage zéro knowledge avec un chiffrement robuste à courbe elliptique.
|
||||
* À réfléchir : permettre à Framadate de faire entrer à des gens plusieurs plages de temps de disponibilité et le service déduit quelles sont les plages de temps favorables (calcul d'intersection sur des lignes discontinues). Cela pourrait être avec divers niveaux de détail. Comme https://omnipointment.com/ (qui est un logiciel privateur)
|
||||
* SSO du fédiverse ?
|
||||
|
||||
# Tableau des avancements
|
||||
https://framagit.org/framasoft/framadate/funky-framadate-front/-/boards
|
||||
|
||||
|
||||
# Choses faites
|
||||
voir le [changelog.md]
|
||||
Les idées et rapports de bugs sont disponibles dans [le tableau des Issues](https://framagit.org/framasoft/framadate/funky-framadate-front/-/boards) sur la forge logicielle.
|
||||
|
||||
## principales
|
||||
|
||||
* Accessibilité renforcée.
|
||||
* Adapté aussi bien sur mobile que grands écrans à haute ou faible densité de pixels.
|
||||
* Tests unitaires et end-to-end.
|
||||
* Couverture de test.
|
||||
* Choix de réponses possibles. Proposer de ne répondre que « oui » ou rien, ou aller dans la nuance en proposant « oui », « peut-être », « non », « ? ». *# Redondance ou le choix de réponses possibles de la première phrase concerne un autre choix ?*
|
||||
* Insertion d'images dans le sondage de type texte, avec des URL uniquement. Une seule image par title possible ou rien.
|
||||
* Thème sombre.
|
||||
* Duplication de sondage à partir d'un autre.
|
||||
* Limiter le nombre de participants maximum
|
||||
|
||||
|
@ -1 +0,0 @@
|
||||
# Installation
|
@ -1,24 +0,0 @@
|
||||
# Angular
|
||||
All doc for Angular is available under https://www.angular.io
|
||||
|
||||
## Code scaffolding
|
||||
|
||||
Run `ng generate component component-choice_label` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
|
||||
|
||||
## Build
|
||||
|
||||
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
|
||||
|
||||
## Running unit tests
|
||||
|
||||
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
||||
|
||||
## Running end-to-end tests
|
||||
|
||||
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
|
||||
|
||||
## Further help
|
||||
|
||||
Before using ng for the first time in this project, use `npm i` to install needed npm modules.
|
||||
|
||||
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
|
@ -1,25 +0,0 @@
|
||||
# Internationalisation - i18n
|
||||
<a href="https://weblate.framasoft.org/engage/funky-framadate/">
|
||||
<img src="https://weblate.framasoft.org/widgets/funky-framadate/-/funky-framadate-front/svg-badge.svg" alt="État de la traduction" />
|
||||
</a>
|
||||
|
||||
## Dans les templates HTML
|
||||
|
||||
Toutes les chaînes de texte doivent être disponible en minimum deux langues: Français et Anglais.
|
||||
|
||||
Pour l'ajout de nouvelles traductions voir [la documentations des traductions.md](../traductions.md)
|
||||
La documentation a été pensée pour être compréhensible en premier lieu par des personnes francophones, le projet étant issu de Framasoft et de personnes uniquement Francophones, nous avons jugé que c'était le moyen le plus efficace pour le faire grandir.
|
||||
|
||||
Voir les fichiers dans le dossier **src/assets/i18n**
|
||||
[EN.json](/src/assets/i18n/en.json) et [FR.json](/src/assets/i18n/fr.json)
|
||||
|
||||
La traduction se base sur un système de clés-valeur dans des fichiers JSON.
|
||||
Les clés sont entrées dans les templates html, et c'est la config d'Angular qui les traduit selon la langue demandée par le visiteur du site.
|
||||
|
||||
Utilisez des sous groupes dans vos traductions afin de mieux segmenter les chaines de caractère par page et selon leur sens.
|
||||
Faites en sorte de réutiliser au maximum les phrases identiques.
|
||||
|
||||
## Traduction de la documentation mkdocs
|
||||
|
||||
Pour traduire cette documentation (les fichiers markdwon dans le dossier /docs/) qui génère un mini site avec mkdocs avec la commande de build, il faut faire des fichiers avec un nom de langue tels que index.fr.md et index.en.md.
|
||||
Plus d'infos: https://www.mkdocs.org/user-guide/configuration/#lang
|
@ -1,4 +0,0 @@
|
||||
# Change log
|
||||
|
||||
## 2021-05-17
|
||||
Documentation générée avec mkdocs
|
@ -1,35 +0,0 @@
|
||||
## Résumé
|
||||
|
||||
(Summarize the bug encountered concisely)
|
||||
|
||||
## Steps to reproduce
|
||||
|
||||
(How one can reproduce the issue - this is very important)
|
||||
|
||||
## Example Project
|
||||
|
||||
(If possible, please create an example project here on GitLab.com that exhibits the problematic
|
||||
behavior, and link to it here in the bug report.
|
||||
If you are using an older version of GitLab, this will also determine whether the bug has been fixed
|
||||
in a more recent version)
|
||||
|
||||
## What is the current bug behavior?
|
||||
|
||||
(What actually happens)
|
||||
|
||||
## What is the expected correct behavior?
|
||||
|
||||
(What you should see instead)
|
||||
|
||||
## Relevant logs and/or screenshots
|
||||
|
||||
(Paste any relevant logs - please use code blocks (```) to format console output, logs, and code, as
|
||||
it's very hard to read otherwise.)
|
||||
|
||||
## Possible fixes
|
||||
|
||||
(If you can, link to the line of code that might be responsible for the problem)
|
||||
|
||||
/label ~bug ~reproduced ~needs-investigation
|
||||
/cc @project-manager
|
||||
/assign @qa-tester
|
Before Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 64 KiB |
@ -1,80 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Diagram>
|
||||
<ID>DATABASE</ID>
|
||||
<OriginalElement>199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.choice</OriginalElement>
|
||||
<nodes>
|
||||
<node x="273.0" y="1219.0">199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.choice</node>
|
||||
<node x="0.0" y="1238.0">199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.stack_of_votes</node>
|
||||
<node x="230.453125" y="1535.0">199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.vote</node>
|
||||
<node x="280.5" y="0.0">199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.owner</node>
|
||||
<node x="226.453125" y="333.0">199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.poll</node>
|
||||
<node x="570.75" y="1200.0">199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.comment</node>
|
||||
</nodes>
|
||||
<notes />
|
||||
<edges>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.comment" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.poll" relationship="REFERENCES">
|
||||
<point x="-65.0" y="-141.5" />
|
||||
<point x="635.75" y="1174.0" />
|
||||
<point x="468.953125" y="1174.0" />
|
||||
<point x="0.0" y="407.5" />
|
||||
</edge>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.stack_of_votes" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.poll" relationship="REFERENCES">
|
||||
<point x="63.25" y="-103.5" />
|
||||
<point x="189.75" y="1174.0" />
|
||||
<point x="468.953125" y="1174.0" />
|
||||
<point x="0.0" y="407.5" />
|
||||
</edge>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.vote" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.poll" relationship="REFERENCES">
|
||||
<point x="97.33333333333331" y="-141.5" />
|
||||
<point x="473.7864583333333" y="1509.0" />
|
||||
<point x="536.5" y="1509.0" />
|
||||
<point x="536.5" y="1174.0" />
|
||||
<point x="468.953125" y="1174.0" />
|
||||
<point x="0.0" y="407.5" />
|
||||
</edge>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.stack_of_votes" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.owner" relationship="REFERENCES">
|
||||
<point x="-63.25" y="-103.5" />
|
||||
<point x="63.25" y="308.0" />
|
||||
<point x="468.0" y="308.0" />
|
||||
<point x="0.0" y="141.5" />
|
||||
</edge>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.choice" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.poll" relationship="REFERENCES">
|
||||
<point x="0.0" y="-122.5" />
|
||||
<point x="399.5" y="1174.0" />
|
||||
<point x="468.953125" y="1174.0" />
|
||||
<point x="0.0" y="407.5" />
|
||||
</edge>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.vote" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.choice" relationship="REFERENCES">
|
||||
<point x="0.0" y="-141.5" />
|
||||
<point x="376.453125" y="1509.0" />
|
||||
<point x="399.5" y="1509.0" />
|
||||
<point x="0.0" y="122.5" />
|
||||
</edge>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.vote" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.stack_of_votes" relationship="REFERENCES">
|
||||
<point x="-97.33333333333331" y="-141.5" />
|
||||
<point x="279.1197916666667" y="1509.0" />
|
||||
<point x="126.5" y="1509.0" />
|
||||
<point x="0.0" y="103.5" />
|
||||
</edge>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.comment" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.owner" relationship="REFERENCES">
|
||||
<point x="65.0" y="-141.5" />
|
||||
<point x="765.75" y="308.0" />
|
||||
<point x="468.0" y="308.0" />
|
||||
<point x="0.0" y="141.5" />
|
||||
</edge>
|
||||
<edge source="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.poll" target="199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.owner" relationship="REFERENCES">
|
||||
<point x="0.0" y="-407.5" />
|
||||
<point x="0.0" y="141.5" />
|
||||
</edge>
|
||||
</edges>
|
||||
<settings layout="Hierarchic" zoom="0.45266594124047876" showDependencies="false" x="415.5" y="909.0" />
|
||||
<SelectedNodes>
|
||||
<node>199d9e19-a935-452f-b6e5-37ffdb194d55.TABLE:framadate_api.poll</node>
|
||||
</SelectedNodes>
|
||||
<Categories>
|
||||
<Category>Columns</Category>
|
||||
<Category>Key columns</Category>
|
||||
<Category>Virtual foreign keys</Category>
|
||||
</Categories>
|
||||
</Diagram>
|
||||
|
Before Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 442 KiB |
Before Width: | Height: | Size: 167 KiB |
Before Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 83 KiB |
@ -1,4 +0,0 @@
|
||||
# Framadate - funky version
|
||||
***
|
||||
EN: A libre polling software made by contributors around the French association Framasoft.
|
||||
This version uses a brand new backend API.ntributeurs de l'association Framasoft, avec une API backend.
|
@ -1,64 +0,0 @@
|
||||
# Framadate - funky version
|
||||
|
||||
FR: Un logiciel libre de sondage fait par les contributeurs de l'association Framasoft, avec une API backend.
|
||||
|
||||
## Index
|
||||
|
||||
* Meeting notes
|
||||
* Getting Started (yarn start / npm start)
|
||||
* How to contribute
|
||||
* Architecture
|
||||
* Translation i18n
|
||||
* Accesibility
|
||||
* Licence GNU affero V3
|
||||
|
||||
# Présentation
|
||||
FR: Un logiciel libre de sondage fait par les contributeurs de l'association Framasoft, avec une API de backend en Symfony 5.
|
||||
|
||||
## Pour débuter
|
||||
[lire la doc pour débuter votre Funky Framadate](GETTING_STARTED.md)
|
||||
|
||||
## Documentation
|
||||
FR: Toute la documentation est disponible [dans le dossier "doc"](/), principalement en Français.
|
||||
EN: All documentation is available in the "doc" folder, mainly in French because reasons.
|
||||
|
||||
|
||||
# Version funky framadate
|
||||
|
||||
* [Spécifications](cadrage/specifications-fonctionnelles)
|
||||
* maquettes par @maiwann : https://scene.zeplin.io/project/5d4d83d68866d6522ff2ff10
|
||||
* vidéo de démo des maquettes par @maiwann : https://nuage.maiwann.net/s/JRRHTR9D2akMAa7
|
||||
* discussions sur framateam canal général : https://framateam.org/ux-framatrucs/channaels/framadate
|
||||
* discussions techniques côté développeurs : https://framateam.org/ux-framatrucs/channels/framadate-dev
|
||||
* [notes de réunion](reunions/notes-de-reunion)
|
||||
* [traductions](traductions)
|
||||
|
||||
|
||||
# Documentations sur Angular
|
||||
|
||||
* `{- sur sass -}` (on va utiliser CSS, si angular permet d'avoir des variables CSS, @newick)
|
||||
|
||||
|
||||
# Exemple de maquette de la nouvelle version
|
||||
|
||||
![schéma de données](img/date-poll-api-schema.png)
|
||||
[voir le schéma UML](img/date-poll-api-schema-diagram.uml)
|
||||
|
||||
--
|
||||
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.1.
|
||||
For full documentation on mkdocs visit [mkdocs.org](https://www.mkdocs.org).
|
||||
notes-de-reunion)
|
||||
* [traductions](traductions)
|
||||
|
||||
|
||||
# Documentations sur Angular
|
||||
|
||||
* `{- sur sass -}` (on va utiliser CSS, si angular permet d'avoir des variables CSS, @newick)
|
||||
|
||||
# Exemple de maquette de la nouvelle version
|
||||
|
||||
![funky_framadate_maquette](img/framadate_funky_design.png)
|
||||
|
||||
|
||||
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.1.
|
||||
For full documentation on mkdocs visit [mkdocs.org](https://www.mkdocs.org).
|
@ -1,27 +0,0 @@
|
||||
# Framadate - funky version
|
||||
|
||||
FR: Un logiciel libre de sondage fait par les contributeurs de l'association Framasoft, avec une API backend.
|
||||
***
|
||||
EN: A libre polling software made by contributors around the French association Framasoft.
|
||||
This version uses a brand new backend API.ntributeurs de l'association Framasoft, avec une API backend.
|
||||
|
||||
## Index
|
||||
|
||||
* Meeting notes
|
||||
* Getting Started (yarn start / npm start)
|
||||
* How to contribute
|
||||
* Architecture
|
||||
* Translation i18n
|
||||
* Accesibility
|
||||
* Licence GNU affero V3
|
||||
|
||||
# Framadate - funky version
|
||||
FR: Un logiciel libre de sondage fait par les contributeurs de l'association Framasoft, avec une API backend.
|
||||
EN: A libre polling software made by contributors around the French association Framasoft.
|
||||
This version uses a brand new backend API.
|
||||
|
||||
## Pour débuter - getting started
|
||||
[lire la doc pour débuter votre Funky Framadate](GETTING_STARTED.md)
|
||||
|
||||
## Documentation
|
||||
voilà voilà
|
28
docs/libs.md
@ -1,28 +0,0 @@
|
||||
# LIBRARIES USED
|
||||
|
||||
| status | lib choice_label | usage |
|
||||
| :-------------: | -------------------------------------------------------------- | --------------------------------------------------------- |
|
||||
| | [axios](https://github.com/axios/axios) | http client |
|
||||
| | [bulma](https://bulma.io/) | CSS framework |
|
||||
| | [chart.js](https://www.chartjs.org/) | PrimeNG solution for graphs. (Chart.js installs MomentJS) |
|
||||
| | [compodoc](https://compodoc.app/) | Generate technic documentation |
|
||||
| | ESlint, Prettier, Lint-staged | Format & lint code |
|
||||
| | [fork-awesome](https://forkaweso.me) | Icons collection |
|
||||
| | [fullcalendar](https://fullcalendar.io/docs/initialize-es6) | PrimeNG solution to manage & display calendars |
|
||||
| | [husky](https://www.npmjs.com/package/husky) | Hook actions on commit |
|
||||
| | [jest](https://jestjs.io/) | test engine |
|
||||
| | [json-server](https://www.npmjs.com/package/json-server) | local server for mocking data backend |
|
||||
| removed | [locale-enum](https://www.npmjs.com/package/locale-enum) | enum of all locales |
|
||||
| | [momentJS](https://momentjs.com/) | manipulate dates. (chartJS’s dependency) |
|
||||
| to be installed | [ng2-charts](https://valor-software.com/ng2-charts/) | Manipulate graphs along with chart.js |
|
||||
| | [ngx-clipboard](https://www.npmjs.com/package/ngx-clipboard) | Handle clipboard |
|
||||
| | [ngx-markdown](https://www.npmjs.com/package/ngx-markdown) | markdown parser |
|
||||
| | [ngx-webstorage](https://www.npmjs.com/package/ngx-webstorage) | handle localStorage & webStorage |
|
||||
| | [primeNG](https://www.primefaces.org/primeng/) | UI components collection |
|
||||
| | [quill](https://www.npmjs.com/package/quill) | powerful rich text editor. WYSIWYG. |
|
||||
| to be installed | [short-uuid](https://www.npmjs.com/package/short-uuid) | generate uuid |
|
||||
| removed | [storybook](https://storybook.js.org/) | StyleGuide UI |
|
||||
| | [ts-mockito](https://www.npmjs.com/package/ts-mockito) | Mocks for testing. |
|
||||
| to be removed | [uuid](https://www.npmjs.com/package/uuid) | generate uuid |
|
||||
|
||||
---
|
@ -1,65 +0,0 @@
|
||||
# 2021
|
||||
![landing_page](../img/landing_page.png)
|
||||
|
||||
## Septembre
|
||||
Début des jours ouvrés par Tykayn avec les designs de la DINUM
|
||||
## Mars
|
||||
la DINUM propose de contribuer à financer le développement de la nouvelle version.
|
||||
|
||||
## Avril
|
||||
### 19 Avr
|
||||
Migration fonctionnelle depuis la BDD de la v1 dans la partie backend
|
||||
|
||||
|
||||
## Octobre
|
||||
### 5 Oct
|
||||
le lien vers le lieu où sont travaillées les maquettes de la DINUM https://www.sketch.com/s/5833607c-e93e-4e9b-9c7e-0614238c6d8c
|
||||
|
||||
présentation des wireframes
|
||||
parcours complet, apparence mobile
|
||||
mobile first
|
||||
barre de progression, étapes 1 sur 5
|
||||
|
||||
comment se présente la gestion des horaires identiques pour chaque jour
|
||||
|
||||
* demander aux admins de framadate quels sont les horaires les plus fréquentes dans les sondages de date
|
||||
* sondage texte: proposer une url d'image ou une URL avec chaque choix de réponse
|
||||
* délai expiration de 180 jours par défaut
|
||||
* proposer de participer au sondage après sa création
|
||||
|
||||
questions , propositions
|
||||
* présenter les dates les plus populaires avec une vue calendrier ?
|
||||
* comment se présente l'écran de vote sur mobile?
|
||||
* quelle mise en forme des images et des url
|
||||
* proposer de faire de l'hébergement d'image locale
|
||||
* mise en forme des plages horaires pour voir qu'elles sont un sous ensemble d'une date
|
||||
* quoi mettre dans le header et footer
|
||||
* mise en avant de la destination des données et du droit qui les régit
|
||||
* personnalisation super admin
|
||||
|
||||
### 7 Oct
|
||||
ici une démo naviguable https://www.sketch.com/s/5833607c-e93e-4e9b-9c7e-0614238c6d8c/a/rbYngRP/play
|
||||
|
||||
icones avec feather icons ou fork awesome pour se séparer des icones google
|
||||
|
||||
faire une page galerie de composants et typographie. la démo comporte une page prête à l'emploi pour ça. on va pouvoir mettre à jour les variables scss de couleur.
|
||||
|
||||
* points de réflexion
|
||||
* affichage du footer, menu, logo
|
||||
* teinte de gris sur les jours non activables
|
||||
* vérifier les contrastes avec tanaguru
|
||||
* lien de démo maquette https://www.sketch.com/s/5833607c-e93e-4e9b-9c7e-0614238c6d8c/a/rbYngRP/play
|
||||
|
||||
|
||||
### 14 Oct
|
||||
quelques notes de la démo du jour: * démo du parcours avec un logo
|
||||
|
||||
* ajout de définition de la date retenue par le créateur du sondage
|
||||
* comment proposer du support, des retours, de la contribution
|
||||
* réponse à un sondage, moyen de dire ok/rien pour toutes les dates
|
||||
* comment proposer les traductions
|
||||
* espace pour personnaliser le footer, les liens de support, le titre, les CGU
|
||||
* accessibilité des graphiques de résultats
|
||||
* quel affichage pour un champ en erreur, message d'explication
|
||||
|
||||
## Novembre
|
@ -1,7 +0,0 @@
|
||||
|
||||
# Février 2022
|
||||
- Présentation du rework design Figma, ajout de la section participation au vote.
|
||||
Prévision de version 1 pour le Lundi 14 Mars 2022.
|
||||
|
||||
# Janvier 2022
|
||||
- Rework design après tests utilisateurs, développement en pause pendant le mois.
|
@ -1,34 +0,0 @@
|
||||
# Traductions
|
||||
<a href="https://weblate.framasoft.org/engage/funky-framadate/">
|
||||
<img src="https://weblate.framasoft.org/widgets/funky-framadate/-/funky-framadate-front/svg-badge.svg" alt="État de la traduction" />
|
||||
</a>
|
||||
<a href="https://weblate.framasoft.org/engage/funky-framadate/">
|
||||
<img src="https://weblate.framasoft.org/widgets/funky-framadate/-/funky-framadate-front/multi-auto.svg" alt="État de la traduction" />
|
||||
</a>
|
||||
|
||||
Les chaînes sont traduites via des clés de fichiers JSON
|
||||
exemple: [src/assets/i18n/FR.json]()
|
||||
|
||||
La mise en place de weblate pour faire des traductions collaboratives a été faite.
|
||||
Vous pouvez contribuer ici https://weblate.framasoft.org/projects/funky-framadate/funky-framadate-front
|
||||
|
||||
Nous avons récupéré les chaînes de traduction du projet Framadate v1, il faudra faire un nettoyage des clés et valeurs inutilisées dans les fichiers de traduction.
|
||||
# Ajouter de nouvelles langues
|
||||
|
||||
Le Weblate effectue automatiquement des Merge Request vers Framagit, si une langue est nouvelle elle proposera de créer un fichier **nom_de_la_langue.json** dans le dossier **src/assets/i18n**
|
||||
|
||||
Pour que l'appli reconnaisse ces nouvelles langues il faut les enregistrer dans l'AppModule.
|
||||
Chaque fichier de traduction est automatiquement chargé dans le [AppModule](../../src/app/app.module.ts) avec le Loader de @ngx-translate. Il faut ensuite ajouter le code de la langue dans l'énumération du fichier **/app/core/enums/language.enum.ts** Examinez l'exemple pour rajouter votre propre traduction.
|
||||
|
||||
``` typescript
|
||||
export enum Language {
|
||||
FR = 'fr',
|
||||
BR = 'br',
|
||||
EN = 'en',
|
||||
//... etc
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
# prise en charges des traductions manquantes
|
||||
Les textes manquants seront indiqués avec "MISSING TRANSLATION FOR" et le nom de la clé demandée par le HTML.
|
@ -1,660 +0,0 @@
|
||||
### GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
<https://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
### Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains
|
||||
free software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing
|
||||
under this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
### TERMS AND CONDITIONS
|
||||
|
||||
#### 0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds
|
||||
of works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of
|
||||
an exact copy. The resulting work is called a "modified version" of
|
||||
the earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user
|
||||
through a computer network, with no transfer of a copy, is not
|
||||
conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices" to
|
||||
the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
#### 1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work for
|
||||
making modifications to it. "Object code" means any non-source form of
|
||||
a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users can
|
||||
regenerate automatically from other parts of the Corresponding Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that same
|
||||
work.
|
||||
|
||||
#### 2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not convey,
|
||||
without conditions so long as your license otherwise remains in force.
|
||||
You may convey covered works to others for the sole purpose of having
|
||||
them make modifications exclusively for you, or provide you with
|
||||
facilities for running those works, provided that you comply with the
|
||||
terms of this License in conveying all material for which you do not
|
||||
control copyright. Those thus making or running the covered works for
|
||||
you must do so exclusively on your behalf, under your direction and
|
||||
control, on terms that prohibit them from making any copies of your
|
||||
copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under the
|
||||
conditions stated below. Sublicensing is not allowed; section 10 makes
|
||||
it unnecessary.
|
||||
|
||||
#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such
|
||||
circumvention is effected by exercising rights under this License with
|
||||
respect to the covered work, and you disclaim any intention to limit
|
||||
operation or modification of the work as a means of enforcing, against
|
||||
the work's users, your or third parties' legal rights to forbid
|
||||
circumvention of technological measures.
|
||||
|
||||
#### 4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
#### 5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these
|
||||
conditions:
|
||||
|
||||
- a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
- b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under
|
||||
section 7. This requirement modifies the requirement in section 4
|
||||
to "keep intact all notices".
|
||||
- c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
- d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
#### 6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms of
|
||||
sections 4 and 5, provided that you also convey the machine-readable
|
||||
Corresponding Source under the terms of this License, in one of these
|
||||
ways:
|
||||
|
||||
- a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
- b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the Corresponding
|
||||
Source from a network server at no charge.
|
||||
- c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
- d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
- e) Convey the object code using peer-to-peer transmission,
|
||||
provided you inform other peers where the object code and
|
||||
Corresponding Source of the work are being offered to the general
|
||||
public at no charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal,
|
||||
family, or household purposes, or (2) anything designed or sold for
|
||||
incorporation into a dwelling. In determining whether a product is a
|
||||
consumer product, doubtful cases shall be resolved in favor of
|
||||
coverage. For a particular product received by a particular user,
|
||||
"normally used" refers to a typical or common use of that class of
|
||||
product, regardless of the status of the particular user or of the way
|
||||
in which the particular user actually uses, or expects or is expected
|
||||
to use, the product. A product is a consumer product regardless of
|
||||
whether the product has substantial commercial, industrial or
|
||||
non-consumer uses, unless such uses represent the only significant
|
||||
mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to
|
||||
install and execute modified versions of a covered work in that User
|
||||
Product from a modified version of its Corresponding Source. The
|
||||
information must suffice to ensure that the continued functioning of
|
||||
the modified object code is in no case prevented or interfered with
|
||||
solely because modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or
|
||||
updates for a work that has been modified or installed by the
|
||||
recipient, or for the User Product in which it has been modified or
|
||||
installed. Access to a network may be denied when the modification
|
||||
itself materially and adversely affects the operation of the network
|
||||
or violates the rules and protocols for communication across the
|
||||
network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
#### 7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders
|
||||
of that material) supplement the terms of this License with terms:
|
||||
|
||||
- a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
- b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
- c) Prohibiting misrepresentation of the origin of that material,
|
||||
or requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
- d) Limiting the use for publicity purposes of names of licensors
|
||||
or authors of the material; or
|
||||
- e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
- f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions
|
||||
of it) with contractual assumptions of liability to the recipient,
|
||||
for any liability that these contractual assumptions directly
|
||||
impose on those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions; the
|
||||
above requirements apply either way.
|
||||
|
||||
#### 8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your license
|
||||
from a particular copyright holder is reinstated (a) provisionally,
|
||||
unless and until the copyright holder explicitly and finally
|
||||
terminates your license, and (b) permanently, if the copyright holder
|
||||
fails to notify you of the violation by some reasonable means prior to
|
||||
60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
#### 9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or run
|
||||
a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
#### 10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
#### 11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims owned
|
||||
or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within the
|
||||
scope of its coverage, prohibits the exercise of, or is conditioned on
|
||||
the non-exercise of one or more of the rights that are specifically
|
||||
granted under this License. You may not convey a covered work if you
|
||||
are a party to an arrangement with a third party that is in the
|
||||
business of distributing software, under which you make payment to the
|
||||
third party based on the extent of your activity of conveying the
|
||||
work, and under which the third party grants, to any of the parties
|
||||
who would receive the covered work from you, a discriminatory patent
|
||||
license (a) in connection with copies of the covered work conveyed by
|
||||
you (or copies made from those copies), or (b) primarily for and in
|
||||
connection with specific products or compilations that contain the
|
||||
covered work, unless you entered into that arrangement, or that patent
|
||||
license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
#### 12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under
|
||||
this License and any other pertinent obligations, then as a
|
||||
consequence you may not convey it at all. For example, if you agree to
|
||||
terms that obligate you to collect a royalty for further conveying
|
||||
from those to whom you convey the Program, the only way you could
|
||||
satisfy both those terms and this License would be to refrain entirely
|
||||
from conveying the Program.
|
||||
|
||||
#### 13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your
|
||||
version supports such interaction) an opportunity to receive the
|
||||
Corresponding Source of your version by providing access to the
|
||||
Corresponding Source from a network server at no charge, through some
|
||||
standard or customary means of facilitating copying of software. This
|
||||
Corresponding Source shall include the Corresponding Source for any
|
||||
work covered by version 3 of the GNU General Public License that is
|
||||
incorporated pursuant to the following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
#### 14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Affero General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever
|
||||
published by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future versions
|
||||
of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
#### 15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
|
||||
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
|
||||
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
|
||||
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
|
||||
CORRECTION.
|
||||
|
||||
#### 16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
|
||||
CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
|
||||
NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
|
||||
LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
|
||||
TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
|
||||
PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
#### 17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
### How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these
|
||||
terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to
|
||||
attach them to the start of each source file to most effectively state
|
||||
the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper
|
||||
mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for
|
||||
the specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. For more information on this, and how to apply and follow
|
||||
the GNU AGPL, see <https://www.gnu.org/licenses/>.
|
@ -1,44 +0,0 @@
|
||||
# What about Framadate v1?
|
||||
source: https://framagit.org/framasoft/framadate/framadate/-/issues/545
|
||||
TL;DR: The project is now in maintenance mode. Follow https://framagit.org/framasoft/framadate/funky-framadate-front and https://framagit.org/tykayn/date-poll-api
|
||||
So I'm going to give a quick update on the status of this project.
|
||||
History
|
||||
|
||||
|
||||
2009/2010: The university of Strasbourg develops STUdS
|
||||
|
||||
May 2011: a Framasoft member forks STUdS into "opensondage" and cleans the code. They installs it for our own internal usage.
|
||||
|
||||
June 2011: Framasoft works again on STUdS/Opensondage, make it more "sexy" (mostly frontend work), the service is accessible publicly at https://framadate.org
|
||||
|
||||
|
||||
2014: the project is transferred to an employee of Framasoft
|
||||
There was a lot of work on the a11y front https://framablog.org/2014/11/26/framadate-nouvelle-version-accessible/ (in french)
|
||||
|
||||
2015: the project is handed to volunteers
|
||||
version 1.0 came out https://framablog.org/2016/10/17/framadate-passage-en-v1-happy-hour-pour-tout-le-monde/ (in french)
|
||||
|
||||
2016: these volunteers are no longer active
|
||||
|
||||
2018: It's the beginning of multiple tentatives to rethink Framadate, including some work by a volunteer designer who produced some mockups.
|
||||
|
||||
2019: A physical reunion with myself and some volunteers (https://www.codeursenliberté.fr/entreprise/contribution_au_libre/ in french) produces what's now the 1.2.0 alpha release, but without further work, it's left abandoned (this is now the develop branch).
|
||||
Around the same time, the poll table gets a UI improvement, which is hotpatched on framadate.org but still not merged here: !412
|
||||
|
||||
|
||||
2016-2021: small contributions from Framasoft/myself and from some volunteers, including some students, bring a few minor versions.
|
||||
A few UX improvements are added, but mostly frontend stuff.
|
||||
The one thing that seems to survive from the multiple tentatives to reboot Framadate is a rewrite in Angular and Symfony: https://framagit.org/framasoft/framadate/funky-framadate-front and https://framagit.org/tykayn/date-poll-api
|
||||
|
||||
|
||||
2021: A french organization (not sure if I can say who) wants to support Framadate and seems to plan to work on the project I've just mentioned above.
|
||||
|
||||
Current status
|
||||
What important here is that we lie on a huge pile of technical dept (more or less well written PHP from ten years ago), because no one - including Framasoft and myself - can find time for Framadate.
|
||||
Framasoft has currently a lot of ongoing projects, and does not wish to try to maintain this one any longer (not that it was done).
|
||||
I could give maintainer rights to some people like @sbernhard who seems to have sent a number of MRs and seems interested in Framadate, but given the state of the project, it's probably better to fork it (it would also remove the frama part in the project name, which we would like to get rid of anyway). If you do, please inform us so that we may link to your own project.
|
||||
Or you can also follow and maybe contribute to this rewrite https://framagit.org/framasoft/framadate/funky-framadate-front and https://framagit.org/tykayn/date-poll-api :)
|
||||
If it become usable and stable enough, we'll consider it to replace the service at https://framadate.org
|
||||
I'm putting the project in maintenance mode for now, meaning we only commit to release security fixes in the foreseeable future.
|
||||
I hope you can understand our position.
|
||||
Thomas, for Framasoft.
|
@ -1,111 +0,0 @@
|
||||
# Guide utilisateur
|
||||
## Principe
|
||||
Framadate permet de créer et répondre à des sondages demandant des disponibilité dans le temps à plusieurs personnes afin de détermnier un consensus pour organiser des rendez-vous.
|
||||
Il faut donc qu'une personne crée un sondage et publie un lien aux personnes qu'elle souhaite réunir.
|
||||
|
||||
## Glossaire
|
||||
|
||||
| Terme | Signification |
|
||||
| :--- | :--- |
|
||||
| Créateur | Personne ayant créé le sondage |
|
||||
| Participant | Personne invitée à participer ou ayant participé |
|
||||
| Archivage | Empêcher votes et commentaires mais conserver les résultats |
|
||||
| _Slug_ | Partie le l'URL identifiant un sondage de manière unique |
|
||||
|
||||
|
||||
## Fonctionnalités actuellement dans framadate legacy et à conserver
|
||||
|
||||
### Généralités
|
||||
|
||||
Il existe deux types de sondage. Le type « dates » est adapté à la proposition de dates (voir [§plages horaires](#plages-horaires)) et le type « texte », plus généraliste, ne contient que du texte. Ce choix est l'un des premiers choix effectués lors de la création d'un nouveau sondage.
|
||||
|
||||
Deux types d'acteurs sont distingués : la personne ayant créé le sondage et les personnes qui répondent au sondage. Ces deux types d'acteurs n'ont pas les mêmes droits sur le sondage : la personne ayant créé le sondage est la seule ayant des droits d'administration sur celui-ci, en plus des droits des participants. En particulier, les droits d'administration permettent d'ajuster les droits des participants.
|
||||
|
||||
|
||||
### Création d'un sondage
|
||||
|
||||
Il est nécessaire de fournir un email lors de la création du sondage. Cela permet aux créateurs de sondages de pouvoir obtenir via email la liste des sondages qu'ils ont créés.
|
||||
|
||||
Il est possible de choisir le _slug_ dans l'URL du sondage, à condition que ce _slug_ soit disponible.
|
||||
|
||||
Le sondage reste modifiable après sa création.
|
||||
|
||||
|
||||
### Plages horaires
|
||||
|
||||
Les sondages de type « dates » permettent de proposer des jours et des plages horaires pour chaque journée.
|
||||
|
||||
Pour faciliter la saisie des dates proposées, il est demandé si les plages horaires sont les mêmes chaque jour ou si elles sont différentes selon les jours. Dans le premier cas, les plages horaires sont demandées uniquement pour le premier jour et sont automatiquement reproduites sur les autres jours.
|
||||
|
||||
Toujours pour faciliter la saisie des propositions, il est possible d'ajouter plusieurs jours consécutifs en sélectionnant le premier et le dernier jour plutôt qu'en sélectionnant chaque jour un à un.
|
||||
|
||||
|
||||
## Participation à un sondage
|
||||
|
||||
### Votes
|
||||
|
||||
Les participants n'ont pas besoin de créer un compte ou de fournir leur email pour participer à un sondage.
|
||||
|
||||
Le créateur du sondage peut protéger le sondage par un mot de passe. Sans ce mot de passe, il est impossible de voir le sondage, donc impossible d'y voter. Attention cependant, le sondage est stocké en clair dans la base de données et ne bénéficie donc d'aucun chiffrement. *# Le mot de passe, lui, est-il chiffré ?*
|
||||
|
||||
Le créateur du sondage choisit de permettre ou non les modifications des votes sur le sondage. Il a le choix entre les trois formules suivantes :
|
||||
|
||||
* ne pas permettre de modifier de réponse ;
|
||||
* permettre de modifier uniquement sa propre réponse a un sondage (modalités d'identification encore non déterminées) ;
|
||||
* permettre de modifier toute réponse à un sondage (y compris celles des autres).
|
||||
|
||||
|
||||
### Commentaires
|
||||
|
||||
Les participants au sondage ont la possibilité de créer des commentaires sur le sondage. Seule la personne ayant les droits d'administration sur le sondage peut modifier les commentaires.
|
||||
|
||||
|
||||
## Résultats
|
||||
|
||||
Selon la configuration du sondage, les résultats peuvent n'être accessibles qu'à la personne ayant un accès d'administration ou bien être publics. Les personnes pouvant accéder aux résultats du sondage peuvent exporter ces résultats au format CSV.
|
||||
|
||||
|
||||
## Emails
|
||||
|
||||
Lorsqu'une personne crée un sondage, un email reprenant les informations du sondage ainsi que les URL uniques servant à le modifier (lien d'administration) et à y participer (lien à transmettre aux participants) lui est envoyé. De plus, elle peut choisir de recevoir des emails lors d'un nouveau vote ou commentaire sur le sondage.
|
||||
|
||||
Une personne ayant créé au moins un sondage peut demander à recevoir par email la liste des sondages qu'elle a créés en utilisant cette adresse email.
|
||||
|
||||
|
||||
## Stockage et export de données
|
||||
|
||||
Les données sont stockées en clair sur le serveur. L'archivage (resp. suppression) automatique des sondages est effectué via cronjob 90 (resp. 120) jours après sa création. Il est possible pour l'administrateur d'un sondage de modifier la durée avant archivage et la suppression automatique suit toujours de 30 jours la date d'archivage.
|
||||
|
||||
L'export d'un sondage et des résultats d'un sondage est possible au format CSV ainsi que JSON.
|
||||
|
||||
|
||||
# Nouveautés dans Framadate Funky
|
||||
Plus de détails dans la section [Historique](../historique.md) pour connaître le cheminement des versions précédentes.
|
||||
Les idées et rapports de bugs sont disponibles dans [le tableau des Issues](https://framagit.org/framasoft/framadate/funky-framadate-front/-/boards) sur la forge logicielle.
|
||||
|
||||
## principales
|
||||
|
||||
* Accessibilité renforcée.
|
||||
* Traduction dynamique de toutes les phrases en choisissant la langue dans le menu.
|
||||
* Adapté aussi bien sur mobile que grands écrans à haute ou faible densité de pixels.
|
||||
* Anti-spam de commentaires.
|
||||
* Anti-spam de vote.
|
||||
* Tests unitaires et end-to-end.
|
||||
* Couverture de test.
|
||||
|
||||
|
||||
## Nouveautés secondaires
|
||||
|
||||
* Choix de réponses possibles. Proposer de ne répondre que « oui » ou rien, ou aller dans la nuance en proposant « oui », « peut-être », « non », « ? ». *# Redondance ou le choix de réponses possibles de la première phrase concerne un autre choix ?*
|
||||
* Insertion d'images dans le sondage de type texte, avec des URL uniquement. Une seule image par title possible ou rien.
|
||||
* Thème sombre.
|
||||
* Duplication de sondage à partir d'un autre.
|
||||
* Boutons pour copier dans le presse-papier les liens publics et privés / admin des sondages.
|
||||
* Limiter le nombre de participants maximum
|
||||
|
||||
|
||||
# Idées pour de futures améliorations (pertinence à vérifier)
|
||||
|
||||
* Gagner en vie privée en chiffrant certaines informations ? Stockage zéro knowledge avec un chiffrement robuste à courbe elliptique.
|
||||
* À réfléchir : permettre à Framadate de faire entrer à des gens plusieurs plages de temps de disponibilité et le service déduit quelles sont les plages de temps favorables (calcul d'intersection sur des lignes discontinues). Cela pourrait être avec divers niveaux de détail. Comme https://omnipointment.com/ (qui est un logiciel privateur)
|
||||
* SSO du fédiverse ?
|
1471
log_boulot.org
70
mkdocs.yml
@ -1,70 +0,0 @@
|
||||
site_name: Funky Framadate Front end
|
||||
site_url: https://framagit.org/framasoft/framadate/funky-framadate-front
|
||||
repo_name: Framagit
|
||||
site_description:
|
||||
docs_dir: docs
|
||||
#docs/
|
||||
# index.md
|
||||
nav:
|
||||
- Accueil:
|
||||
- Accueil : index.en.md
|
||||
- Accueil : index.fr.md
|
||||
- en cours: TODO.md
|
||||
- Guide utilisateur:
|
||||
- Guide général: user-guide/index.md
|
||||
- License: user-guide/LICENCE.en.md
|
||||
- Guide administrateur:
|
||||
- Changelog: changelog.md
|
||||
- Changelog Détaillé: ../../CHANGELOG.md
|
||||
- Guide développeur:
|
||||
- Démarrer: GETTING_STARTED.md
|
||||
- Personnaliser: customisation.md
|
||||
- Accessibilité: cadrage/accessibility.md
|
||||
- Architecture: cadrage/architecture.md
|
||||
- Contribuer: dev-guide/CONTRIBUTE.md
|
||||
- Angular: angular.md
|
||||
- Traduction: cadrage/i18n.md
|
||||
- Historique:
|
||||
- Historique: user-guide/history.md
|
||||
- Spécifications: cadrage/specifications-fonctionnelles.md
|
||||
- Réunions:
|
||||
- Modèle vierge: reunions/0_blank_notes.md
|
||||
- 2020_08_09: reunions/2020_08_09.md
|
||||
- 2019_08_09: reunions/2019_08_09.md
|
||||
|
||||
|
||||
plugins:
|
||||
- search
|
||||
- i18n:
|
||||
languages:
|
||||
fr: "Français"
|
||||
en: "English"
|
||||
default_language: 'fr'
|
||||
no_translation:
|
||||
en: "This page isn't translated to English."
|
||||
fr: "Cette page n'est pas traduite en Français."
|
||||
translate_nav:
|
||||
en:
|
||||
section title: "Section"
|
||||
subsection: "Subsection"
|
||||
page title: "Page with title translated"
|
||||
fr:
|
||||
section title: "Section"
|
||||
subsection: "Sous section"
|
||||
page title: "Page avec un titre traduite"
|
||||
|
||||
#theme:
|
||||
# name: slate
|
||||
# nav_style: dark
|
||||
extra:
|
||||
# Default mkdocs-material alternate links for untranslated pages
|
||||
# https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector
|
||||
alternate:
|
||||
- name: English
|
||||
link: ""
|
||||
lang: en
|
||||
|
||||
- name: Français
|
||||
link: ""
|
||||
lang: fr
|
||||
|
@ -6,7 +6,7 @@
|
||||
"polls": [
|
||||
{
|
||||
"id": 1,
|
||||
"custom_url": "picnic",
|
||||
"slug": "picnic",
|
||||
"configuration": {
|
||||
"id": 1,
|
||||
"isAboutDate": true,
|
||||
@ -24,7 +24,7 @@
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"custom_url": "vacances",
|
||||
"slug": "vacances",
|
||||
"configuration": {
|
||||
"id": 2,
|
||||
"isAboutDate": true,
|
||||
|
@ -1,84 +0,0 @@
|
||||
export default {
|
||||
allow_comments: true,
|
||||
allowComments: true,
|
||||
allowed_answers: [],
|
||||
areResultsPublic: true,
|
||||
choices: [],
|
||||
choices_grouped: [],
|
||||
comments: [],
|
||||
creation_date: '2021-05-18T20:40:51.385Z',
|
||||
custom_url: 'sdfsfdsfg',
|
||||
dateChoices: [
|
||||
{
|
||||
date_object: '2021-05-19T20:40:18.500Z',
|
||||
literal: '2021-05-19',
|
||||
timeSlices: {},
|
||||
},
|
||||
{
|
||||
date_object: '2021-05-20T20:40:18.500Z',
|
||||
literal: '2021-05-20',
|
||||
timeSlices: {},
|
||||
},
|
||||
{
|
||||
date_object: '2021-05-21T20:40:18.500Z',
|
||||
literal: '2021-05-21',
|
||||
timeSlices: {},
|
||||
},
|
||||
{
|
||||
date_object: '2021-05-22T20:40:18.500Z',
|
||||
literal: '2021-05-22',
|
||||
timeSlices: {},
|
||||
},
|
||||
{
|
||||
date_object: '2021-05-18T20:40:33.557Z',
|
||||
literal: '',
|
||||
timeSlices: [],
|
||||
},
|
||||
{
|
||||
date_object: '2021-05-18T20:40:33.557Z',
|
||||
literal: '',
|
||||
timeSlices: [],
|
||||
},
|
||||
{
|
||||
date_object: '2021-05-18T20:40:33.557Z',
|
||||
literal: '',
|
||||
timeSlices: [],
|
||||
},
|
||||
],
|
||||
default_expiracy_days_from_now: 60,
|
||||
description: 'RSVP',
|
||||
has_several_hours: false,
|
||||
hasSeveralHours: false,
|
||||
id: 0,
|
||||
is_zero_knowledge: false,
|
||||
isMaybeAnswerAvailable: false,
|
||||
isOwnerNotifiedByEmailOnNewComment: false,
|
||||
isOwnerNotifiedByEmailOnNewVote: false,
|
||||
kind: 'date',
|
||||
max_count_of_answers: true,
|
||||
maxCountOfAnswers: 150,
|
||||
modification_policy: 'everybody',
|
||||
owner: {
|
||||
email: 'example@example.com',
|
||||
polls: [],
|
||||
pseudo: 'pseudo',
|
||||
},
|
||||
password: '',
|
||||
stacks: [],
|
||||
timeSlices: [
|
||||
{
|
||||
literal: 'matin',
|
||||
},
|
||||
{
|
||||
literal: 'midi',
|
||||
},
|
||||
{
|
||||
literal: 'après-midi',
|
||||
},
|
||||
{
|
||||
literal: 'soir',
|
||||
},
|
||||
],
|
||||
title: 'sdfsfdsfg',
|
||||
votes: [],
|
||||
};
|
20905
package-lock.json
generated
Normal file
253
package.json
@ -1,134 +1,123 @@
|
||||
{
|
||||
"name": "framadate-funky-frontend",
|
||||
"version": "0.6.0",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"engines": {
|
||||
"node": ">= 16.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve",
|
||||
"build:prod": "ng build --prod",
|
||||
"build:prod:stats": "ng build --prod --stats-json",
|
||||
"build:prod:gitlabpage": "ng build --prod --baseHref=/framadate/funky-framadate-front/",
|
||||
"build:prod:demobliss": "ng build --prod --baseHref=https://framadate-api.cipherbliss.com --stats-json ",
|
||||
"test": "jest",
|
||||
"test:watch": "jest --watch",
|
||||
"test:ci": "jest --ci",
|
||||
"lint": "prettier --write \"src/**/*.{js,jsx,ts,tsx,md,html,css,scss}\"",
|
||||
"e2e": "ng e2e",
|
||||
"release:major": "changelog -M && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version major && git push origin && git push origin --tags",
|
||||
"release:minor": "changelog -m && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version minor && git push origin && git push origin --tags",
|
||||
"release:patch": "changelog -p && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version patch && git push origin && git push origin --tags",
|
||||
"format:check": "prettier --list-different \"src/{app,environments,assets}/**/*{.ts,.js,.json,.css,.scss}\"",
|
||||
"format:all": "prettier --write \"src/**/*.{js,jsx,ts,tsx,md,html,css,scss}\"",
|
||||
"trans": "ng xi18n --output-path=src/locale --i18n-locale=fr",
|
||||
"compodoc": "compodoc -p tsconfig.app.json",
|
||||
"mock:server": "json-server --port 8000 --watch ./mocks/db.json --routes ./mocks/routes.json",
|
||||
"start:proxy": "ng serve --proxy-config proxy.conf.json",
|
||||
"start:proxymock": "concurrently --kill-others \"yarn mock:server\" \"yarn start:proxy\"",
|
||||
"i18n:init": "ngx-translate-extract --input ./src --output ./src/assets/i18n/template.json --key-as-default-value --replace --format json",
|
||||
"i18n:extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/{en,da,de,fi,nb,nl,sv}.json --clean --format json"
|
||||
},
|
||||
"private": false,
|
||||
"dependencies": {
|
||||
"@angular/animations": "^9.1.1",
|
||||
"@angular/cdk": "^9.2.2",
|
||||
"@angular/common": "^9.0.7",
|
||||
"@angular/compiler": "^9.0.7",
|
||||
"@angular/core": "^9.0.7",
|
||||
"@angular/forms": "^9.0.7",
|
||||
"@angular/localize": "^9.1.1",
|
||||
"@angular/material": "^9.2.4",
|
||||
"@angular/platform-browser": "^9.0.7",
|
||||
"@angular/platform-browser-dynamic": "^9.0.7",
|
||||
"@angular/router": "^9.0.7",
|
||||
"@biesbjerg/ngx-translate-extract": "^7.0.3",
|
||||
"@biesbjerg/ngx-translate-po-http-loader": "^3.1.0",
|
||||
"@fullcalendar/core": "^4.4.0",
|
||||
"@ngx-translate/core": "^12.1.2",
|
||||
"@ngx-translate/http-loader": "^5.0.0",
|
||||
"angular-date-value-accessor": "^1.0.2",
|
||||
"axios": "^0.19.2",
|
||||
"bulma": "^0.9.0",
|
||||
"bulma-switch": "^2.0.0",
|
||||
"chart.js": "^2.9.3",
|
||||
"crypto": "^1.0.1",
|
||||
"crypto-js": "^4.0.0",
|
||||
"feather-icons": "^4.28.0",
|
||||
"fork-awesome": "^1.1.7",
|
||||
"ng-keyboard-shortcuts": "^10.1.17",
|
||||
"ng2-charts": "^2.3.0",
|
||||
"ngx-clipboard": "^13.0.0",
|
||||
"ngx-markdown": "^9.0.0",
|
||||
"ngx-webstorage": "^5.0.0",
|
||||
"node-forge": "^0.10.0",
|
||||
"primeicons": "^5.0.0",
|
||||
"primeng": "^11.0.0",
|
||||
"quill": "^1.3.7",
|
||||
"rxjs": "^6.5.5",
|
||||
"rxjs-compat": "^6.5.5",
|
||||
"short-unique-id": "^3.0.3",
|
||||
"stream": "^0.0.2",
|
||||
"tslib": "<2.0.0",
|
||||
"zone.js": "^0.10.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-builders/jest": "^9.0.1",
|
||||
"@angular-devkit/build-angular": "^0.901.2",
|
||||
"@angular/cli": "^9.1.2",
|
||||
"@angular/compiler-cli": "^9.1.1",
|
||||
"@angular/language-service": "^9.0.7",
|
||||
"@babel/core": "^7.9.0",
|
||||
"@babel/preset-env": "^7.9.5",
|
||||
"@babel/preset-typescript": "^7.9.0",
|
||||
"@compodoc/compodoc": "^1.1.11",
|
||||
"@types/crypto-js": "^4.0.0",
|
||||
"@types/jest": "^26.0.0",
|
||||
"@types/node": "^14.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "^3.0.0",
|
||||
"@typescript-eslint/parser": "^3.0.0",
|
||||
"babel-jest": "^26.0.0",
|
||||
"concurrently": "^5.2.0",
|
||||
"eslint": "^7.0.0",
|
||||
"eslint-config-prettier": "^6.11.0",
|
||||
"eslint-plugin-prettier": "^3.1.3",
|
||||
"husky": "^4.2.5",
|
||||
"jest": "^26.0.0",
|
||||
"jest-environment-jsdom-sixteen": "^1.0.3",
|
||||
"jest-preset-angular": "^8.1.3",
|
||||
"json-server": "^0.16.1",
|
||||
"lint-staged": "^10.1.7",
|
||||
"prettier": "^2.0.5",
|
||||
"protractor": "~7.0.0",
|
||||
"ts-jest": "^26.0.0",
|
||||
"ts-mockito": "^2.5.0",
|
||||
"ts-node": "^8.10.1",
|
||||
"typescript": "<3.9.0"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"src/**/*.{js,jsx,ts,tsx,md,html,css,scss}": [
|
||||
"prettier --write",
|
||||
"git add"
|
||||
],
|
||||
"*.js": [
|
||||
"prettier --write"
|
||||
]
|
||||
},
|
||||
"jest": {
|
||||
"preset": "jest-preset-angular",
|
||||
"setupFilesAfterEnv": [
|
||||
"<rootDir>/src/jest.setup.ts"
|
||||
],
|
||||
"testEnvironment": "jest-environment-jsdom-sixteen",
|
||||
"transform": {
|
||||
"^.+\\.(ts|html)$": "ts-jest",
|
||||
"^.+\\.jsx?$": "babel-jest"
|
||||
}
|
||||
}
|
||||
"name": "framadate-funky-frontend",
|
||||
"version": "1.0.0",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve",
|
||||
"build:prod": "ng build --prod",
|
||||
"build:prod:stats": "ng build --prod --stats-json",
|
||||
"build:prod:gitlabpage": "ng build --prod --baseHref=/framadate/funky-framadate-front/",
|
||||
"build:prod:demobliss": "ng build --prod --baseHref=https://framadate-api.cipherbliss.com --stats-json ",
|
||||
"test": "jest",
|
||||
"test:watch": "jest --watch",
|
||||
"test:ci": "jest --ci",
|
||||
"lint": "prettier --write \"src/**/*.{js,jsx,ts,tsx,md,html,css,scss}\"",
|
||||
"e2e": "ng e2e",
|
||||
"format:check": "prettier --list-different \"src/{app,environments,assets}/**/*{.ts,.js,.json,.css,.scss}\"",
|
||||
"format:all": "prettier --write \"src/**/*.{js,jsx,ts,tsx,md,html,css,scss}\"",
|
||||
"trans": "ng xi18n --output-path=src/locale --i18n-locale=fr",
|
||||
"compodoc": "compodoc -p tsconfig.app.json",
|
||||
"mock:server": "json-server --port 8000 --watch ./mocks/db.json --routes ./mocks/routes.json",
|
||||
"start:proxy": "ng serve --proxy-config proxy.conf.json",
|
||||
"start:proxymock": "concurrently --kill-others \"yarn mock:server\" \"yarn start:proxy\"",
|
||||
"i18n:init": "ngx-translate-extract --input ./src --output ./src/assets/i18n/template.json --key-as-default-value --replace --format json",
|
||||
"i18n:extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/{en,da,de,fi,nb,nl,sv}.json --clean --format json"
|
||||
},
|
||||
"private": false,
|
||||
"dependencies": {
|
||||
"@angular/animations": "^9.1.1",
|
||||
"@angular/cdk": "^9.2.2",
|
||||
"@angular/common": "^9.0.7",
|
||||
"@angular/compiler": "^9.0.7",
|
||||
"@angular/core": "^9.0.7",
|
||||
"@angular/forms": "^9.0.7",
|
||||
"@angular/localize": "^9.1.1",
|
||||
"@angular/material": "^9.2.4",
|
||||
"@angular/platform-browser": "^9.0.7",
|
||||
"@angular/platform-browser-dynamic": "^9.0.7",
|
||||
"@angular/router": "^9.0.7",
|
||||
"@biesbjerg/ngx-translate-extract": "^7.0.3",
|
||||
"@biesbjerg/ngx-translate-po-http-loader": "^3.1.0",
|
||||
"@fullcalendar/core": "^4.4.0",
|
||||
"@ngx-translate/core": "^12.1.2",
|
||||
"@ngx-translate/http-loader": "^5.0.0",
|
||||
"angular-date-value-accessor": "^1.0.2",
|
||||
"axios": "^0.19.2",
|
||||
"bulma": "^0.9.0",
|
||||
"bulma-switch": "^2.0.0",
|
||||
"chart.js": "^2.9.3",
|
||||
"crypto": "^1.0.1",
|
||||
"fork-awesome": "^1.1.7",
|
||||
"ng2-charts": "^2.3.0",
|
||||
"ngx-clipboard": "^13.0.0",
|
||||
"ngx-markdown": "^9.0.0",
|
||||
"ngx-webstorage": "^5.0.0",
|
||||
"node-forge": "^0.10.0",
|
||||
"primeng": "^9.0.6",
|
||||
"quill": "^1.3.7",
|
||||
"rxjs": "^6.5.5",
|
||||
"rxjs-compat": "^6.5.5",
|
||||
"short-unique-id": "^3.0.3",
|
||||
"stream": "^0.0.2",
|
||||
"tslib": "<2.0.0",
|
||||
"zone.js": "^0.10.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-builders/jest": "^9.0.1",
|
||||
"@angular-devkit/build-angular": "^0.901.2",
|
||||
"@angular/cli": "^9.1.2",
|
||||
"@angular/compiler-cli": "^9.1.1",
|
||||
"@angular/language-service": "^9.0.7",
|
||||
"@babel/core": "^7.9.0",
|
||||
"@babel/preset-env": "^7.9.5",
|
||||
"@babel/preset-typescript": "^7.9.0",
|
||||
"@compodoc/compodoc": "^1.1.11",
|
||||
"@types/jest": "^26.0.0",
|
||||
"@types/node": "^14.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "^3.0.0",
|
||||
"@typescript-eslint/parser": "^3.0.0",
|
||||
"babel-jest": "^26.0.0",
|
||||
"concurrently": "^5.2.0",
|
||||
"eslint": "^7.0.0",
|
||||
"eslint-config-prettier": "^6.11.0",
|
||||
"eslint-plugin-prettier": "^3.1.3",
|
||||
"husky": "^4.2.5",
|
||||
"jest": "^26.0.0",
|
||||
"jest-environment-jsdom-sixteen": "^1.0.3",
|
||||
"jest-preset-angular": "^8.1.3",
|
||||
"json-server": "^0.16.1",
|
||||
"lint-staged": "^10.1.7",
|
||||
"prettier": "^2.0.5",
|
||||
"protractor": "~7.0.0",
|
||||
"ts-jest": "^26.0.0",
|
||||
"ts-mockito": "^2.5.0",
|
||||
"ts-node": "^8.10.1",
|
||||
"typescript": "<3.9.0"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"src/**/*.{js,jsx,ts,tsx,md,html,css,scss}": [
|
||||
"prettier --write",
|
||||
"git add"
|
||||
],
|
||||
"*.js": [
|
||||
"prettier --write"
|
||||
]
|
||||
},
|
||||
"jest": {
|
||||
"preset": "jest-preset-angular",
|
||||
"setupFilesAfterEnv": [
|
||||
"<rootDir>/src/jest.setup.ts"
|
||||
],
|
||||
"testEnvironment": "jest-environment-jsdom-sixteen",
|
||||
"transform": {
|
||||
"^.+\\.(ts|html)$": "ts-jest",
|
||||
"^.+\\.jsx?$": "babel-jest"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
11
proxy.conf.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"/api/v1/*": {
|
||||
"target": "http://localhost:8000",
|
||||
"secure": false,
|
||||
"pathRewrite": {
|
||||
"^/api/v1": ""
|
||||
},
|
||||
"changeOrigin": false,
|
||||
"logLevel": "debug"
|
||||
}
|
||||
}
|
@ -3,12 +3,7 @@ import { RouterModule } from '@angular/router';
|
||||
import { routes } from './routes-framadate';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
RouterModule.forRoot(routes, {
|
||||
useHash: true,
|
||||
anchorScrolling: 'enabled',
|
||||
}),
|
||||
],
|
||||
imports: [RouterModule.forRoot(routes, { useHash: true })],
|
||||
exports: [RouterModule],
|
||||
})
|
||||
export class AppRoutingModule {}
|
||||
|
@ -1,11 +1,23 @@
|
||||
<div id="big_container" [class]="themeClass">
|
||||
<app-header
|
||||
*ngIf="onHomePage || environment.display_menu_creation"
|
||||
[appTitle]="appTitle"
|
||||
[appLogo]="appLogo"
|
||||
></app-header>
|
||||
<main [@routeAnimations]="prepareRoute(outlet)">
|
||||
<router-outlet #outlet></router-outlet>
|
||||
</main>
|
||||
</div>
|
||||
<app-footer *ngIf="onHomePage || environment.display_menu_creation"></app-footer>
|
||||
<mat-sidenav-container (backdropClick)="sidenav.toggle()">
|
||||
<mat-sidenav #sidenav mode="side">
|
||||
<app-navigation></app-navigation>
|
||||
</mat-sidenav>
|
||||
|
||||
<mat-sidenav-content>
|
||||
<div id="big_container" [class]="themeClass">
|
||||
<div class="container">
|
||||
<app-header [appTitle]="appTitle" [appLogo]="appLogo"></app-header>
|
||||
<main>
|
||||
<router-outlet></router-outlet>
|
||||
<div class="padded" *ngIf="devModeEnabled">
|
||||
<br />
|
||||
<mat-slide-toggle (change)="sidenav.toggle()" label="dev menu"> </mat-slide-toggle> menu
|
||||
développeur
|
||||
</div>
|
||||
</main>
|
||||
<app-footer></app-footer>
|
||||
<app-feedback></app-feedback>
|
||||
</div>
|
||||
</div>
|
||||
</mat-sidenav-content>
|
||||
</mat-sidenav-container>
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { AfterViewInit, Component, Inject, OnDestroy, OnInit } from '@angular/core';
|
||||
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { Subscription } from 'rxjs';
|
||||
|
||||
@ -6,85 +6,31 @@ import { environment } from '../environments/environment';
|
||||
import { Theme } from './core/enums/theme.enum';
|
||||
import { LanguageService } from './core/services/language.service';
|
||||
import { ThemeService } from './core/services/theme.service';
|
||||
import { NavigationEnd, Route, Router } from '@angular/router';
|
||||
import { slideInAnimation } from './shared/animations/main';
|
||||
import { FramaKeyboardShortcuts } from './shared/shortcuts/main';
|
||||
import { ShortcutEventOutput, ShortcutInput } from 'ng-keyboard-shortcuts';
|
||||
import { PollService } from './core/services/poll.service';
|
||||
import { PrimeNGConfig } from 'primeng/api';
|
||||
import { ApiService } from './core/services/api.service';
|
||||
import { DOCUMENT } from '@angular/common';
|
||||
import { Poll } from './core/models/poll.model';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { ToastService } from './core/services/toast.service';
|
||||
import { StorageService } from './core/services/storage.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-root',
|
||||
templateUrl: './app.component.html',
|
||||
styleUrls: ['./app.component.scss'],
|
||||
animations: [slideInAnimation],
|
||||
})
|
||||
export class AppComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||
shortcuts: ShortcutInput[] = FramaKeyboardShortcuts;
|
||||
|
||||
export class AppComponent implements OnInit, OnDestroy {
|
||||
public appTitle: string = environment.appTitle;
|
||||
public appLogo: string = environment.appLogo;
|
||||
public themeClass: string;
|
||||
public isSidebarOpened = false;
|
||||
public devModeEnabled = !environment.production;
|
||||
public environment = environment;
|
||||
|
||||
public onHomePage = false;
|
||||
private themeSubscription: Subscription;
|
||||
|
||||
constructor(
|
||||
private router: Router,
|
||||
private titleService: Title,
|
||||
private translate: TranslateService,
|
||||
private themeService: ThemeService,
|
||||
private pollService: PollService,
|
||||
private storageService: StorageService,
|
||||
private apiService: ApiService,
|
||||
private toastService: ToastService,
|
||||
private config: PrimeNGConfig,
|
||||
@Inject(DOCUMENT) private document: any,
|
||||
private languageService: LanguageService // private mockingService: MockingService
|
||||
) {}
|
||||
|
||||
printpath(parent: string, config: Route[]) {
|
||||
for (let i = 0; i < config.length; i++) {
|
||||
const route = config[i];
|
||||
if (route.children) {
|
||||
const currentPath = route.path ? parent + '/' + route.path : parent;
|
||||
this.printpath(currentPath, route.children);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.languageService.getPrimeNgStrings().subscribe((resp) => {
|
||||
this.config.setTranslation(resp);
|
||||
this.pollService.updateTitle();
|
||||
});
|
||||
|
||||
this.printpath('', this.router.config);
|
||||
this.router.events.subscribe((evt) => {
|
||||
if (!(evt instanceof NavigationEnd)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.onHomePage = evt.url === '/';
|
||||
this.pollService.updateTitle();
|
||||
setTimeout(() => {
|
||||
window.scrollTo(0, 0);
|
||||
}, 10);
|
||||
});
|
||||
|
||||
if (!environment.production) {
|
||||
this.appTitle += ' [DEV]';
|
||||
}
|
||||
|
||||
this.titleService.setTitle(this.appTitle);
|
||||
this.languageService.configureAndInitTranslations();
|
||||
this.themeSubscription = this.themeService.theme.subscribe((theme: Theme) => {
|
||||
switch (theme) {
|
||||
@ -103,42 +49,13 @@ export class AppComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||
});
|
||||
}
|
||||
|
||||
ngAfterViewInit(): void {
|
||||
this.setupShortcuts();
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
if (this.themeSubscription) {
|
||||
this.themeSubscription.unsubscribe();
|
||||
}
|
||||
}
|
||||
|
||||
prepareRoute(outlet: any) {
|
||||
return outlet && outlet.activatedRouteData && outlet.activatedRouteData.animation;
|
||||
}
|
||||
|
||||
private setupShortcuts() {
|
||||
this.shortcuts.push(
|
||||
{
|
||||
key: '?',
|
||||
label: 'Help',
|
||||
description: 'Question mark',
|
||||
command: (e) => console.log('question mark clicked', { e }),
|
||||
preventDefault: true,
|
||||
},
|
||||
{
|
||||
key: ['up up down down left right left right b a enter'],
|
||||
label: 'Sequences',
|
||||
description: 'Konami code!',
|
||||
command: (output: ShortcutEventOutput) => console.log('Konami code!!!', output),
|
||||
},
|
||||
{
|
||||
key: ['cmd + b'],
|
||||
label: 'Help',
|
||||
description: 'Cmd + b',
|
||||
command: (e) => console.log(e),
|
||||
preventDefault: true,
|
||||
}
|
||||
);
|
||||
public toggleSidebar(status: boolean): void {
|
||||
this.isSidebarOpened = status === true;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { CommonModule, registerLocaleData } from '@angular/common';
|
||||
import { HttpClient, HttpClientModule } from '@angular/common/http';
|
||||
|
||||
import localeEn from '@angular/common/locales/en';
|
||||
import localeFr from '@angular/common/locales/fr';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { BrowserModule, Title } from '@angular/platform-browser';
|
||||
@ -26,11 +27,8 @@ import { CguComponent } from './features/shared/components/ui/static-pages/cgu/c
|
||||
import { LegalComponent } from './features/shared/components/ui/static-pages/legal/legal.component';
|
||||
import { PrivacyComponent } from './features/shared/components/ui/static-pages/privacy/privacy.component';
|
||||
import { CipheringComponent } from './features/shared/components/ui/static-pages/ciphering/ciphering.component';
|
||||
import { ErrorsListComponent } from './features/shared/components/ui/form/errors-list/errors-list.component';
|
||||
import { KeyboardShortcutsModule } from 'ng-keyboard-shortcuts';
|
||||
import { AdministrationModule } from './features/administration/administration.module';
|
||||
import { ChoiceButtonDinumComponent } from './features/shared/components/choice-button-dinum/choice-button-dinum.component';
|
||||
import { StaticPagesComponent } from './features/shared/static-pages/static-pages.component';
|
||||
registerLocaleData(localeEn, 'en-EN');
|
||||
registerLocaleData(localeFr, 'fr-FR');
|
||||
|
||||
export class MyMissingTranslationHandler implements MissingTranslationHandler {
|
||||
public handle(params: MissingTranslationHandlerParams): string {
|
||||
@ -39,21 +37,13 @@ export class MyMissingTranslationHandler implements MissingTranslationHandler {
|
||||
}
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
||||
return new TranslateHttpLoader(http);
|
||||
}
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
AppComponent,
|
||||
CguComponent,
|
||||
LegalComponent,
|
||||
PrivacyComponent,
|
||||
CipheringComponent,
|
||||
StaticPagesComponent,
|
||||
],
|
||||
declarations: [AppComponent, CguComponent, LegalComponent, PrivacyComponent, CipheringComponent],
|
||||
imports: [
|
||||
AppRoutingModule,
|
||||
AdministrationModule,
|
||||
BrowserAnimationsModule,
|
||||
BrowserModule,
|
||||
ClipboardModule,
|
||||
@ -61,12 +51,11 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
CoreModule,
|
||||
FormsModule,
|
||||
HttpClientModule,
|
||||
KeyboardShortcutsModule.forRoot(),
|
||||
MarkdownModule.forRoot(),
|
||||
NgxWebstorageModule.forRoot({ prefix: environment.localStorage.key }),
|
||||
SharedModule,
|
||||
TranslateModule.forRoot({
|
||||
defaultLanguage: environment.defaultLanguage,
|
||||
defaultLanguage: 'FR',
|
||||
loader: {
|
||||
provide: TranslateLoader,
|
||||
useFactory: HttpLoaderFactory,
|
||||
@ -81,6 +70,5 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
],
|
||||
providers: [Title, TranslateService],
|
||||
bootstrap: [AppComponent],
|
||||
exports: [ErrorsListComponent, ChoiceButtonDinumComponent],
|
||||
})
|
||||
export class AppModule {}
|
||||
|
@ -1,52 +1,19 @@
|
||||
<footer class="footer main-footer" role="content-info">
|
||||
<div class="content container">
|
||||
<div class="logo-box">
|
||||
<a href="/" class="pull-left">
|
||||
<img
|
||||
class="app-logo logo"
|
||||
*ngIf="env.appLogoFooter"
|
||||
src="{{ env.appLogo }}"
|
||||
alt="{{ env.appTitle }} logo"
|
||||
/>
|
||||
</a>
|
||||
<div class="app-title pull-left">
|
||||
{{ env.appTitle }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="pages-links">
|
||||
<!-- <div>Nos Mentions légales</div>-->
|
||||
<a href="{{ env.appSupportWebpage }}">
|
||||
Contact
|
||||
</a>
|
||||
<a href="mailto:{{ env.appSupportEmail }}">
|
||||
Support
|
||||
</a>
|
||||
<a routerLink="/page/legal">
|
||||
Mentions légales
|
||||
</a>
|
||||
<a routerLink="/page/cgu">
|
||||
Conditions générales d’utilisation
|
||||
</a>
|
||||
<a routerLink="/page/privacy">
|
||||
Politique de confidentialité
|
||||
</a>
|
||||
<footer class="footer">
|
||||
<div class="content has-text-centered">
|
||||
<p>
|
||||
<img class="app-logo logo" *ngIf="env.appLogo" src="{{ env.appLogo }}" alt="{{ env.appTitle }}" />
|
||||
|
||||
<a href="#">
|
||||
Accessibilité : Totalement conforme
|
||||
</a>
|
||||
</div>
|
||||
<p *ngIf="show_bottom_sources">
|
||||
{{ env.appTitle }} - {{ env.appVersion }} - libérez vos sondages. <i class="fa fa-copyleft"></i> Logiciel
|
||||
libre sous licence AGPL v3.
|
||||
<app-theme-selector></app-theme-selector>
|
||||
|
||||
<a href="https://framagit.org/framasoft/framadate/funky-framadate-front/-/tree/master">
|
||||
<a href="https://framagit.org/framasoft/framadate/funky-framadate-front">
|
||||
<i class="fa fa-gitlab"></i> Sources</a
|
||||
>
|
||||
|
|
||||
<a href="https://framagit.org/framasoft/framadate/funky-framadate-front/-/tree/master/docs">
|
||||
<a href="https://framagit.org/framasoft/framadate/funky-framadate-front/-/wikis/home">
|
||||
<i class="fa fa-book"></i>
|
||||
🚴 Documentation
|
||||
Documentation
|
||||
</a>
|
||||
|
|
||||
<a href="https://framateam.org/ux-framatrucs/channels/framadate">
|
||||
|
@ -1,43 +1,4 @@
|
||||
@import '../../../../styles/variables';
|
||||
|
||||
.main-footer {
|
||||
.app-title {
|
||||
min-height: 5rem;
|
||||
line-height: 5rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
.logo-box {
|
||||
height: 5rem;
|
||||
border-bottom: 1px solid $white;
|
||||
margin-bottom: 1rem;
|
||||
width: 100%;
|
||||
}
|
||||
a {
|
||||
color: $white;
|
||||
}
|
||||
|
||||
img {
|
||||
max-height: $header-nav-inner-height;
|
||||
}
|
||||
|
||||
.border-bottom {
|
||||
border-bottom: solid 1px #ccc;
|
||||
}
|
||||
|
||||
.pages-links {
|
||||
a {
|
||||
border-right: 1px solid $white;
|
||||
padding-left: 1rem;
|
||||
padding-right: 1rem;
|
||||
|
||||
&:first-of-type {
|
||||
padding-left: 0;
|
||||
border-left: 0;
|
||||
}
|
||||
&:last-of-type {
|
||||
padding-right: 0;
|
||||
border-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.app-logo {
|
||||
max-width: 5em;
|
||||
max-height: 5em;
|
||||
}
|
||||
|
@ -8,12 +8,7 @@ import { environment } from '../../../../environments/environment';
|
||||
})
|
||||
export class FooterComponent implements OnInit {
|
||||
public env = environment;
|
||||
show_bottom_sources: boolean = environment.show_bottom_sources;
|
||||
constructor() {}
|
||||
|
||||
ngOnInit(): void {}
|
||||
|
||||
subscribeToNewsletter() {
|
||||
alert('TODO');
|
||||
}
|
||||
}
|
||||
|
@ -1,109 +1,49 @@
|
||||
<header class="big-header" role="header">
|
||||
<div class="contained-desktop">
|
||||
<div class="container">
|
||||
<a class="logo-home-link pull-left" routerLink="/">
|
||||
<img class="header-app-logo app-logo logo" *ngIf="appLogo" src="{{ appLogo }}" alt="{{ appTitle }}" />
|
||||
<header class="big-header">
|
||||
<nav class="navbar" role="navigation" aria-label="main navigation">
|
||||
<div class="navbar-brand">
|
||||
<a class="navbar-item" routerLink="/">
|
||||
<img class="app-logo logo" *ngIf="appLogo" src="{{ appLogo }}" alt="{{ appTitle }}" />
|
||||
<span class="app-title title is-2">
|
||||
{{ appTitle }}
|
||||
</span>
|
||||
<span class="dev-env button has-background-success" *ngIf="!env.production">
|
||||
<i>
|
||||
(dev)
|
||||
</i>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<div class="create-section" *ngIf="environment.display_header_create_button">
|
||||
<a class="button is-primary" role="button" routerLink="/administration" routerLinkActive="is-active">
|
||||
<a
|
||||
role="button"
|
||||
class="navbar-burger burger"
|
||||
aria-label="menu"
|
||||
aria-expanded="false"
|
||||
data-target="navbarBasicExample"
|
||||
[ngClass]="{ 'has-background-primary': mobileMenuVisible }"
|
||||
(click)="mobileMenuVisible = !mobileMenuVisible"
|
||||
>
|
||||
<span aria-hidden="true"></span>
|
||||
<span aria-hidden="true"></span>
|
||||
<span aria-hidden="true"></span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div id="navbarBasicExample" class="navbar-menu">
|
||||
<div class="navbar-start">
|
||||
<a class="navbar-item btn btn--primary" routerLink="administration" routerLinkActive="is-active">
|
||||
<i class="fa fa-plus-circle"></i>
|
||||
<div class="is-hidden-touch">
|
||||
{{ 'creation.init' | translate }}
|
||||
</div>
|
||||
<span>
|
||||
{{ 'config.title' | translate }}
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="pull-right right-end-bar">
|
||||
<app-language-selector class=""></app-language-selector>
|
||||
|
||||
<div class="navbar-end">
|
||||
<app-language-selector></app-language-selector>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mobile-menu" *ngIf="mobileMenuVisible">
|
||||
<!-- menu mobile-->
|
||||
<app-language-selector></app-language-selector>
|
||||
menu mobile
|
||||
</div>
|
||||
<div
|
||||
*ngIf="environment.showDemoWarning"
|
||||
class="demo demo-warning well debug has-text-white-bis has-background-warning-dark padded marged"
|
||||
>
|
||||
<!-- infos locales storage-->
|
||||
<i class="fa fa-info"></i>
|
||||
Ce site est un espace de démonstration, les informations que vous y mettrez seront régulièrement supprimées.
|
||||
N'en faites pas une utilisation réelle.
|
||||
</div>
|
||||
|
||||
<div class="demo padded box has-background-info-light" *ngIf="environment.display_routes">
|
||||
voici des liens de démonstration issus des fixtures Doctrine de date-poll-api.
|
||||
<div class="padded">
|
||||
<div class="">
|
||||
<a class="navbar-item" [routerLink]="['/poll/demo/consultation']" routerLinkActive="is-primary">
|
||||
<i class="fa fa-file-epub"></i>
|
||||
<em>
|
||||
demo
|
||||
</em>
|
||||
</a>
|
||||
<a
|
||||
class="navbar-item"
|
||||
[routerLink]="['/poll/dessin-anime/consultation']"
|
||||
routerLinkActive="is-primary"
|
||||
>
|
||||
<i class="fa fa-picture-o"></i>
|
||||
<em>
|
||||
dessin-anime
|
||||
</em>
|
||||
</a>
|
||||
<a
|
||||
class="navbar-item"
|
||||
[routerLink]="['/poll/aujourdhui-ou-demain/consultation']"
|
||||
routerLinkActive="is-primary"
|
||||
>
|
||||
<i class="fa fa-clock-o"></i>
|
||||
<em>
|
||||
aujourdhui-ou-demain
|
||||
</em>
|
||||
</a>
|
||||
<a
|
||||
class="navbar-item"
|
||||
[routerLink]="[
|
||||
'/admin/9S75b70ECXI5J5xDc058d3H40H9r2CHfO0Kj8T02EK2U8rY8fYTn-eS659j2Dhp794Oa6R1b9V70e3WGaE30iD9h45zwdm76C85SWB4LcUCrc7e0Ncc0'
|
||||
]"
|
||||
routerLinkActive="is-primary"
|
||||
>
|
||||
<i class="fa fa-gears"></i> administrer le sondage
|
||||
<em>
|
||||
aujourdhui-ou-demain
|
||||
</em>
|
||||
</a>
|
||||
<a
|
||||
class="navbar-item"
|
||||
[routerLink]="['/poll/citron/consultation/prompt']"
|
||||
routerLinkActive="is-primary"
|
||||
>
|
||||
<i class="fa fa-key"></i>
|
||||
<em>
|
||||
citron
|
||||
</em>
|
||||
écran de saisie de mot de passe
|
||||
</a>
|
||||
<a
|
||||
class="navbar-item"
|
||||
[routerLink]="['/poll/citron/consultation/secure/1c01ed9c94fc640a1be864f197ff808c']"
|
||||
routerLinkActive="is-primary"
|
||||
>
|
||||
<i class="fa fa-key-modern"></i>
|
||||
<em>
|
||||
citron
|
||||
</em>
|
||||
+ pass intégré sans saisie
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a
|
||||
*ngIf="environment.display_routes"
|
||||
class="has-text-black"
|
||||
href="/#/administration/key/8Ubcg2YI99f69xz946cn4O64bQAebi11012P70trL5372qJ9JOem1Ks2fz7XD0b09p-8Ubcg2YI99f69xz946cn4O64bQAeb"
|
||||
>
|
||||
<i class="fa fa-hand-paper-o"></i> test admin link to edit poll
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
@ -1,51 +1,17 @@
|
||||
@import '../../../../styles/variables';
|
||||
.big-header {
|
||||
height: $header-nav-height;
|
||||
padding-top: 1rem;
|
||||
padding-left: 1rem;
|
||||
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.05);
|
||||
position: fixed;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
background: $white;
|
||||
z-index: 2;
|
||||
.logo-home-link {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
.app-title {
|
||||
color: $white !important;
|
||||
line-height: 4rem;
|
||||
display: inline-block;
|
||||
}
|
||||
.header-app-logo {
|
||||
width: $logo-side;
|
||||
height: $logo-side;
|
||||
}
|
||||
.navbar-item {
|
||||
a {
|
||||
&:hover {
|
||||
background: $primary_color;
|
||||
color: $white;
|
||||
:host {
|
||||
header {
|
||||
nav {
|
||||
padding-right: 1em;
|
||||
.fa {
|
||||
margin-right: 1ch;
|
||||
}
|
||||
}
|
||||
.container {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
img {
|
||||
max-height: $header-nav-height;
|
||||
}
|
||||
|
||||
.fa {
|
||||
margin: 0 1ch;
|
||||
}
|
||||
}
|
||||
|
||||
.give-to-project {
|
||||
.button {
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
app-language-selector {
|
||||
.fa {
|
||||
color: $white;
|
||||
.app-logo {
|
||||
max-width: 5em;
|
||||
max-height: 5em;
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
import { SettingsComponent } from '../../../shared/components/settings/settings.component';
|
||||
import { Owner } from '../../models/owner.model';
|
||||
import { User } from '../../models/user.model';
|
||||
import { ModalService } from '../../services/modal.service';
|
||||
import { UserService } from '../../services/user.service';
|
||||
import { environment } from '../../../../environments/environment';
|
||||
@ -13,13 +13,13 @@ import { environment } from '../../../../environments/environment';
|
||||
styleUrls: ['./header.component.scss'],
|
||||
})
|
||||
export class HeaderComponent implements OnInit {
|
||||
@Input() public appTitle = environment.appTitle;
|
||||
@Input() public appLogo = environment.appLogo;
|
||||
@Input() public linkToHome: boolean = true;
|
||||
public _user: Observable<User> = this.userService.user;
|
||||
public env = environment;
|
||||
@Input() public appTitle: string = 'FramaDate Funky';
|
||||
@Input() public appLogo: string;
|
||||
mobileMenuVisible = false;
|
||||
public environment = environment;
|
||||
|
||||
constructor() {}
|
||||
constructor(private userService: UserService) {}
|
||||
|
||||
public ngOnInit(): void {}
|
||||
}
|
||||
|
@ -1,227 +1,173 @@
|
||||
<section>
|
||||
<div class="landing-box">
|
||||
<div class="landing container content">
|
||||
<div class="columns presentation">
|
||||
<div class="column">
|
||||
<h1 class="title is-1 has-text-primary marged-v">
|
||||
{{ 'config.landing_title' | translate }}
|
||||
<section class="hero">
|
||||
<div class="hero-body">
|
||||
<div class="container">
|
||||
<div class="column">
|
||||
<blockquote class="notification is-info is-light content is-size-3 has-text-weight-light">
|
||||
<h1 class="title">
|
||||
{{ 'home.title' | translate }}
|
||||
{{ env.appTitle }}
|
||||
</h1>
|
||||
<p class="subtitle marged-v">
|
||||
{{ 'config.landing_subtitle' | translate: { AppTitle: AppTitle } }}
|
||||
</p>
|
||||
<div class="columns">
|
||||
<div class="column">
|
||||
<button class="is-fullwidth is-primary" routerLink="administration">
|
||||
{{ 'config.letsgo' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="column">
|
||||
<button
|
||||
id="open_popup_button"
|
||||
class="is-fullwidth is-secondary is-outlined"
|
||||
(click)="openModalFindPoll()"
|
||||
>
|
||||
{{ 'config.discover' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<i class="fa fa-poll"></i>
|
||||
{{
|
||||
'SENTENCES.framadate-is-an-online-service-for-planning-an-appointment-or-making-a-decision-quickly-and-easily'
|
||||
| translate
|
||||
}}
|
||||
</blockquote>
|
||||
<img src="assets/img/undraw_group_selfie_ijc6.svg" alt="image WIP" />
|
||||
</div>
|
||||
<div class="columns">
|
||||
<div class="column">
|
||||
<h2 class="subtitle">
|
||||
{{ 'home.subtitle' | translate }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="column">
|
||||
<img
|
||||
class="app-logo logo"
|
||||
*ngIf="environment.appLanding"
|
||||
src="{{ environment.appLanding }}"
|
||||
alt="{{ environment.appTitle }}"
|
||||
/>
|
||||
<h2 class="subtitle">
|
||||
{{ 'home.search_title' | translate }}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
<fieldset
|
||||
class="well debug has-background-info-light padded is-rounded"
|
||||
*ngIf="environment.show_graphic_chart"
|
||||
>
|
||||
<section class="buttons-demo">
|
||||
<h1 class="title is-1">Boutons de démo - Titre h1</h1>
|
||||
<h2 class="title is-2">Titre h2</h2>
|
||||
<h3 class="title is-3">Titre h3</h3>
|
||||
<h4 class="title is-4">Titre h4</h4>
|
||||
<h5 class="title is-5">Titre h5</h5>
|
||||
<h6 class="title is-6">Titre h6</h6>
|
||||
<button class="is-primary is-disabled">bouton primaire inactif</button>
|
||||
<button class="is-primary">bouton primaire</button>
|
||||
<button class="is-primary is-thin">bouton primaire fin</button>
|
||||
<button class="is-final">bouton succès</button>
|
||||
<button class="is-secondary is-disabled">bouton secondaire inactif</button>
|
||||
<button class="is-secondary">bouton secondaire</button>
|
||||
<button class="is-secondary is-thin">bouton secondaire fin</button>
|
||||
<button class="is-action">bouton action</button>
|
||||
<button class="is-action is-thin">bouton action fin</button>
|
||||
</section>
|
||||
<section>
|
||||
Autres boutons:
|
||||
<button id="close_dialog_more" class="is-closing-popup">
|
||||
bouton fermeture popin <img class="icon fa" src="assets/icons/x_blue.svg" />
|
||||
</button>
|
||||
<app-language-selector></app-language-selector>
|
||||
|
||||
<div class="delete-date">
|
||||
<button class="has-background-trash has-background-icon-left is-filtered-icon-primary">
|
||||
{{ 'dates.remove' | translate }} N
|
||||
</button>
|
||||
</div>
|
||||
<div class="add-time-choice">
|
||||
<button
|
||||
class="has-text-primary has-no-border is-large-button has-text-left has-background-transparent has-background-plus has-background-icon-left is-filtered-icon-primary"
|
||||
>
|
||||
{{ 'hours.add' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- dialog search-->
|
||||
|
||||
<form (ngSubmit)="searchMyPolls()">
|
||||
<p-dialog
|
||||
[modal]="true"
|
||||
[(visible)]="display_poll_search_dialog"
|
||||
[breakpoints]="{ '600px': '75vw', '400px': '95vw' }"
|
||||
[style]="{ width: '486px' }"
|
||||
[draggable]="false"
|
||||
[showHeader]="false"
|
||||
[resizable]="true"
|
||||
>
|
||||
<div class="home-content">
|
||||
<div class="top">
|
||||
<button
|
||||
id="close_dialog"
|
||||
class="no-outline cancel-button-reject pull-right has-no-border is-closing-popup"
|
||||
(click)="focusOnCancelButton()"
|
||||
>
|
||||
{{ 'SENTENCES.Close' | translate }} <img class="icon fa" src="assets/icons/x_blue.svg" />
|
||||
</button>
|
||||
<div class="columns">
|
||||
<div class="column">
|
||||
<a role="button" class="button is-fullwidth is-primary is-size-3" routerLink="administration">
|
||||
<i class="fa fa-plus-circle"></i>
|
||||
{{ 'home.create_button' | translate }}
|
||||
</a>
|
||||
<img src="assets/img/kind/date.jpeg" alt="sondage date" />
|
||||
</div>
|
||||
<div class="">
|
||||
<section class="search">
|
||||
<div class="">
|
||||
<div class="search-others column">
|
||||
<h2 class="title is-2">
|
||||
{{ 'home.search_title' | translate }}
|
||||
</h2>
|
||||
<div class="search-description">
|
||||
{{ 'home.search_subtitle' | translate }}
|
||||
</div>
|
||||
<label for="search_email">
|
||||
{{ 'home.search_label' | translate }}
|
||||
</label>
|
||||
<input
|
||||
type="email"
|
||||
pattern="[^@]+@[^@]+\.[a-zA-Z]{2,6}"
|
||||
class="is-full input"
|
||||
name="search_email"
|
||||
id="search_email"
|
||||
[ngClass]="{
|
||||
'has-background-success': email_sent,
|
||||
'ng-invalid has-background-warning':
|
||||
storageService.vote_stack.owner.email.length &&
|
||||
nonexistent_email === storageService.vote_stack.owner.email
|
||||
}"
|
||||
[(ngModel)]="storageService.vote_stack.owner.email"
|
||||
/>
|
||||
<div class="email_sent has-background-success padded" *ngIf="email_sent">
|
||||
<i class="fa fa-envelope"></i> C'est envoyé! Vérifiez votre boite email, ainsi que
|
||||
votre dossier de spam.
|
||||
</div>
|
||||
<div
|
||||
class="email_error has-background-warning padded"
|
||||
*ngIf="email_sent && nonexistent_email === storageService.vote_stack.owner.email"
|
||||
>
|
||||
<i class="fa fa-warning"></i> Aucun sondage enregistré pour cet email.
|
||||
</div>
|
||||
</div>
|
||||
<div class="column">
|
||||
<a role="button" class="button is-fullwidth is-info is-size-3" routerLink="user/polls">
|
||||
<i class="fa fa-search"></i>
|
||||
{{ 'home.search_button' | translate }}
|
||||
</a>
|
||||
<img src="assets/img/kind/classic.jpeg" alt="sondage date" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column">
|
||||
<div class="columns">
|
||||
<div class="column">
|
||||
<h2 class="title is-2">
|
||||
<i class="fa fa-format-paint"></i>
|
||||
{{ 'SENTENCES.here-is-how-it-works' | translate }}
|
||||
</h2>
|
||||
<p>
|
||||
{{ 'SENTENCES.send-the-poll-link-to-your-friends-or-colleagues' | translate }}
|
||||
|
||||
{{ 'SENTENCES.what-you-can-do' | translate }}
|
||||
</p>
|
||||
<h2 class="title is-2">
|
||||
<i class="fa fa-format-paint"></i>
|
||||
{{ 'SENTENCES.view-an-example' | translate }}
|
||||
</h2>
|
||||
<p>
|
||||
<a href="/poll/orange-ou-citron/consultation" class="btn btn-info">
|
||||
<i class="fa fa-biking"></i> Orange ou citron?
|
||||
</a>
|
||||
</p>
|
||||
<p>
|
||||
<i class="fa fa-gavel"></i>
|
||||
|
||||
{{ 'SENTENCES.framadate-is-licensed-under-the' | translate }}
|
||||
<span class="licence has-text-weight-medium">
|
||||
<i class="fa fa-gnu"></i>
|
||||
GNU Affero v3 Licence
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="column">
|
||||
<h2 class="title is-2">
|
||||
<i class="fa fa-seeding"></i>
|
||||
{{ 'SENTENCES.grow-your-own' | translate }}
|
||||
</h2>
|
||||
<p>
|
||||
{{
|
||||
'SENTENCES.if-you-want-to-install-the-software-for-your-own-use-and-thus-increase-your-independence-we-can-help'
|
||||
| translate
|
||||
}}
|
||||
{{
|
||||
'SENTENCES.to-participate-in-the-software-development-suggest-improvements-or-simply-download-it-please-visit'
|
||||
| translate
|
||||
}}
|
||||
{{ 'SENTENCES.the-development-site' | translate }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- statistiques-->
|
||||
<p class="title">Statistiques</p>
|
||||
<app-wip-todo></app-wip-todo>
|
||||
<div class="tile is-ancestor">
|
||||
<div class="tile is-4 is-vertical is-parent">
|
||||
<div class="tile is-child box">
|
||||
<div class="title">
|
||||
<i class="fa fa-check-circle"></i>
|
||||
62 346
|
||||
</div>
|
||||
</section>
|
||||
<p>sondages</p>
|
||||
</div>
|
||||
<div class="tile is-child box">
|
||||
<div class="title">
|
||||
<i class="fa fa-tachometer"></i>
|
||||
223 124
|
||||
</div>
|
||||
<p>votes</p>
|
||||
</div>
|
||||
|
||||
<div class="tile is-child box">
|
||||
<div class="title">
|
||||
<i class="fa fa-comment-o"></i>
|
||||
41 875
|
||||
</div>
|
||||
<p>commentaires</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tile is-parent">
|
||||
<div class="tile is-child box">
|
||||
<div class="title">
|
||||
<i class="fa fa-calendar-check-o"></i>
|
||||
44 985
|
||||
</div>
|
||||
<p>sondages de type date</p>
|
||||
</div>
|
||||
|
||||
<div class="tile is-child box">
|
||||
<div class="title">
|
||||
<i class="fa fa-file-epub"></i>
|
||||
22 985
|
||||
</div>
|
||||
<p>sondages de type classique</p>
|
||||
</div>
|
||||
<div class="tile is-child box">
|
||||
<div class="title">
|
||||
<i class="fa fa-check-circle-o"></i>
|
||||
123
|
||||
</div>
|
||||
<p>consensus parfaits</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ng-template pTemplate="footer" class="has-text-right">
|
||||
<button
|
||||
class="button is-secondary"
|
||||
(click)="focusOnCancelButton()"
|
||||
id="cancel_popup_button"
|
||||
aria-haspopup="dialog"
|
||||
>
|
||||
{{ 'nav.leave' | translate }}
|
||||
</button>
|
||||
<button
|
||||
type="submit"
|
||||
role="button"
|
||||
class="button is-primary button-submit"
|
||||
(click)="searchMyPolls()"
|
||||
[disabled]="
|
||||
!storageService.vote_stack.owner.email.length &&
|
||||
storageService.vote_stack.owner.email.indexOf('@') !== -1
|
||||
"
|
||||
routerLink="user/polls"
|
||||
>
|
||||
<i class="fa fa-search"></i>
|
||||
{{ 'home.search_button' | translate }}
|
||||
</button>
|
||||
</ng-template>
|
||||
</p-dialog>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<div class="demos">
|
||||
<div class="poll-list">
|
||||
<ul>
|
||||
<li *ngFor="let p of storageService.userPolls">
|
||||
<a class="is-fullwidth padded" [routerLink]="'poll/' + p.custom_url + '/consultation'">
|
||||
{{ p.title }}
|
||||
<i class="fa fa-arrow-right pull-right"></i>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<section class="demo-capabilities">
|
||||
<div
|
||||
*ngIf="environment.showDemoWarning"
|
||||
class="demo demo-warning well has-background-warning-light padded marged"
|
||||
>
|
||||
<h3 class="title is-3">
|
||||
Ce que l'on peut faire sur cette démo:
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
☑️ Créer un nouveau sondage
|
||||
</li>
|
||||
<li>
|
||||
☑️ accéder à un sondage existant en tant que visiteur, ajouter une réponse (StackOfVote) et un
|
||||
commentaire.
|
||||
</li>
|
||||
<li>
|
||||
☑️
|
||||
<a href="https://framagit.org/framasoft/framadate/funky-framadate-front/-/tree/master/docs"
|
||||
>lire la documentation</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 class="title is-3">
|
||||
Ce qu'on ne peut pas encore faire:
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
🚴️ mettre à jour son vote à un sondage
|
||||
</li>
|
||||
<li>
|
||||
🚴 modifier un de ses sondages existants par un lien d'administration
|
||||
</li>
|
||||
<li>
|
||||
🚴 recevoir immédiatement les emails. Ceux ci nécessitent un vidage du spool d'emails du backend
|
||||
sur demande (mesure anti spam).
|
||||
</li>
|
||||
</ul>
|
||||
<div class="box">
|
||||
<h2 class="title">Nos Mentions légales</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="/legal">
|
||||
mentions légales,
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/cgu">
|
||||
CGU, CPU,
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/privacy">
|
||||
politique de confidentialité.
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@ -1,40 +1,6 @@
|
||||
@import '../../../../styles/variables';
|
||||
|
||||
:host {
|
||||
.content {
|
||||
padding: 0;
|
||||
padding-left: 1rem;
|
||||
}
|
||||
.subtitle,
|
||||
.presentation {
|
||||
.columns {
|
||||
margin-left: 0;
|
||||
}
|
||||
.column {
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.landing-box {
|
||||
padding: 6em 0;
|
||||
color: $primary_color;
|
||||
min-height: 80vh;
|
||||
}
|
||||
|
||||
text-align: center;
|
||||
a .fa {
|
||||
margin-right: 1ch;
|
||||
}
|
||||
|
||||
.home-content {
|
||||
.title,
|
||||
.subtitle {
|
||||
color: $secondary_color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.search {
|
||||
.search-description {
|
||||
margin: 2rem 0;
|
||||
}
|
||||
}
|
||||
|
@ -1,81 +1,11 @@
|
||||
import { ChangeDetectorRef, Component, Inject, OnInit } from '@angular/core';
|
||||
import { Component } from '@angular/core';
|
||||
import { environment } from '../../../../environments/environment';
|
||||
import { StorageService } from '../../services/storage.service';
|
||||
import { ApiService } from '../../services/api.service';
|
||||
import { ToastService } from '../../services/toast.service';
|
||||
import { DOCUMENT } from '@angular/common';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { PollService } from '../../services/poll.service';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-home',
|
||||
templateUrl: './home.component.html',
|
||||
styleUrls: ['./home.component.scss'],
|
||||
})
|
||||
export class HomeComponent implements OnInit {
|
||||
public environment = environment;
|
||||
public AppTitle = environment.appTitle;
|
||||
public nonexistent_email = '';
|
||||
public email_sent = false;
|
||||
display_poll_search_dialog: any = false;
|
||||
|
||||
constructor(
|
||||
@Inject(DOCUMENT) private document: any,
|
||||
public storageService: StorageService,
|
||||
public toastService: ToastService,
|
||||
public titleService: Title,
|
||||
private api: ApiService,
|
||||
private pollService: PollService,
|
||||
private translate: TranslateService,
|
||||
private cd: ChangeDetectorRef
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
// this.openModalFindPoll();
|
||||
this.pollService.step_current = null;
|
||||
this.pollService.updateTitle();
|
||||
}
|
||||
|
||||
searchMyPolls() {
|
||||
const email = this.storageService.vote_stack.owner.email;
|
||||
this.email_sent = false;
|
||||
this.api.findMyPollsByEmail(email).then(
|
||||
(resp) => {
|
||||
console.log('resp', resp);
|
||||
|
||||
if (resp) {
|
||||
if (resp.data && resp.data.mail_sent == '1') {
|
||||
this.toastService.display("C'est bon, vérifiez votre boite mail");
|
||||
this.email_sent = true;
|
||||
}
|
||||
}
|
||||
},
|
||||
(error) => {
|
||||
if (error.response.status == '404') {
|
||||
this.toastService.display('Aucun sondage géré par cet email : ' + email);
|
||||
this.nonexistent_email = email;
|
||||
this.document.querySelector('#search_email').select();
|
||||
}
|
||||
console.log('error', error);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
openModalFindPoll() {
|
||||
this.display_poll_search_dialog = true;
|
||||
this.cd.detectChanges();
|
||||
let buttonClose = this.document.querySelector('#close_dialog');
|
||||
if (buttonClose) {
|
||||
buttonClose.focus();
|
||||
}
|
||||
}
|
||||
|
||||
focusOnCancelButton() {
|
||||
this.display_poll_search_dialog = false;
|
||||
let buttonClose = this.document.querySelector('#open_popup_button');
|
||||
if (buttonClose) {
|
||||
buttonClose.focus();
|
||||
}
|
||||
}
|
||||
export class HomeComponent {
|
||||
public env = environment;
|
||||
}
|
||||
|
@ -1,60 +1,62 @@
|
||||
<nav class="has-background-light padded">
|
||||
<a class="navbar-item" [routerLink]="['/administration']" routerLinkActive="is-primary">
|
||||
{{ 'creation.title' | translate }}
|
||||
</a>
|
||||
<a
|
||||
role="button"
|
||||
class="navbar-item burger-button-menu-custom is-visible-mobile"
|
||||
aria-label="menu"
|
||||
aria-expanded="false"
|
||||
data-target="navbarBasicExample"
|
||||
[ngClass]="{ 'has-background-primary': mobileMenuVisible }"
|
||||
(click)="mobileMenuVisible = !mobileMenuVisible"
|
||||
>
|
||||
<i class="fa fa-bars" *ngIf="!mobileMenuVisible"></i>
|
||||
<i class="fa fa-times" *ngIf="mobileMenuVisible"></i>
|
||||
</a>
|
||||
<div class="navbar-item has-dropdown is-hoverable is-warning" *ngIf="environment.display_routes">
|
||||
<div class="padded">
|
||||
<a class="navbar-link"> Démos fixtures</a>
|
||||
<div class="navbar-dropdown">
|
||||
<a
|
||||
class="navbar-item"
|
||||
[routerLink]="['/poll/dessin-anime/consultation']"
|
||||
[routerLinkActive]="'is-primary'"
|
||||
>
|
||||
<em>
|
||||
dessin-anime
|
||||
</em>
|
||||
</a>
|
||||
<a
|
||||
class="navbar-item"
|
||||
[routerLink]="['/poll/aujourdhui-ou-demain/consultation']"
|
||||
routerLinkActive="is-primary"
|
||||
>
|
||||
consulter le sondage
|
||||
<em>
|
||||
aujourdhui-ou-demain
|
||||
</em>
|
||||
</a>
|
||||
<a class="navbar-item" [routerLink]="['/poll/citron/hash/consultation']" routerLinkActive="is-primary">
|
||||
<em>
|
||||
citron
|
||||
</em>
|
||||
sans pass
|
||||
</a>
|
||||
|
||||
<a
|
||||
class="navbar-item"
|
||||
[routerLink]="['/poll/citron/consultation/1c01ed9c94fc640a1be864f197ff808c']"
|
||||
routerLinkActive="is-primary"
|
||||
>
|
||||
<em>
|
||||
citron
|
||||
</em>
|
||||
+ pass
|
||||
</a>
|
||||
</div>
|
||||
<nav class="has-background-light">
|
||||
<div class="navbar-item has-dropdown is-hoverable">
|
||||
<a class="navbar-link"> Tous les sondages </a>
|
||||
<div class="navbar-dropdown">
|
||||
<a
|
||||
class="navbar-item"
|
||||
*ngFor="let poll of _pollsAvailables | async"
|
||||
routerLink="{{ '/poll/' + poll.slug + '/consultation' }}"
|
||||
routerLinkActive="is-active"
|
||||
>
|
||||
« {{ poll.slug }} »
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="navbar-item has-dropdown is-hoverable is-warning" *ngIf="devModeEnabled">
|
||||
<a class="navbar-link"> Modules </a>
|
||||
<div class="navbar-dropdown">
|
||||
<a class="navbar-item" routerLink="oldstuff" routerLinkActive="is-active">
|
||||
Old stuff
|
||||
</a>
|
||||
<a class="navbar-item" routerLink="administration" routerLinkActive="is-active">
|
||||
Administration
|
||||
</a>
|
||||
<a class="navbar-item" routerLink="consultation" routerLinkActive="is-active">
|
||||
Consultation
|
||||
</a>
|
||||
<a class="navbar-item" routerLink="participation" routerLinkActive="is-active">
|
||||
Participation
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
<a class="navbar-item" routerLink="/poll/inexistentPoll/consultation" routerLinkActive="is-active">
|
||||
« inexistentPoll »
|
||||
</a>
|
||||
<hr />
|
||||
<a class="button is-block" routerLink="oldstuff/step/creation" routerLinkActive="active"> Création </a>
|
||||
<a class="button is-block" routerLink="oldstuff/step/date" routerLinkActive="active"> Les Dates </a>
|
||||
<a class="button is-block" routerLink="oldstuff/step/answers" routerLinkActive="active"> Réponses </a>
|
||||
<a class="button is-block" routerLink="oldstuff/step/visibility" routerLinkActive="active"> Visibilité </a>
|
||||
<a class="button is-block" routerLink="oldstuff/step/resume" routerLinkActive="active"> Résumé </a>
|
||||
<a class="button is-block" routerLink="oldstuff/step/end" routerLinkActive="active"> Confirmation </a>
|
||||
<a class="button is-block" routerLink="oldstuff/step/admin"> Administration </a>
|
||||
|
||||
<hr />
|
||||
|
||||
<a class="button is-block" routerLink="oldstuff/step/kind" routerLinkActive="active"> Page démo </a>
|
||||
<a class="button is-block" routerLink="oldstuff/vote/poll/id/1" routerLinkActive="active"> Sondage 1 </a>
|
||||
<a class="button is-block" routerLink="oldstuff/vote/poll/id/2" routerLinkActive="active"> Sondage 2 </a>
|
||||
<a class="button is-block" routerLink="oldstuff/vote/poll/id/3" routerLinkActive="active">
|
||||
Sondage 3 (dessins animés)
|
||||
</a>
|
||||
<a class="button is-block" routerLink="oldstuff/graphic/toto" routerLinkActive="active"> Graphique </a>
|
||||
</div>
|
||||
|
||||
<a class="button is-block" routerLink="oldstuff/step/home" routerLinkActive="active">
|
||||
<i class="fa fa-home" aria-hidden="true"></i> Accueil
|
||||
</a>
|
||||
</nav>
|
||||
|
@ -1,6 +0,0 @@
|
||||
@import '../../../../../styles/variables';
|
||||
|
||||
em {
|
||||
margin-left: 1ch;
|
||||
margin-right: 1ch;
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
import { Poll } from '../../../models/poll.model';
|
||||
@ -13,10 +13,6 @@ import { environment } from '../../../../../environments/environment';
|
||||
export class NavigationComponent implements OnInit {
|
||||
public _pollsAvailables: Observable<Poll[]> = this.mockingService.pollsAvailables;
|
||||
public devModeEnabled = !environment.production;
|
||||
@Input() public appTitle = 'FramaDate Funky';
|
||||
@Input() public appLogo: string;
|
||||
public environment = environment;
|
||||
mobileMenuVisible: boolean;
|
||||
|
||||
constructor(private mockingService: MockingService) {}
|
||||
|
||||
|
@ -4,17 +4,18 @@ import { FormsModule } from '@angular/forms';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
import { FooterComponent } from './components/footer/footer.component';
|
||||
import { HeaderComponent } from './components/header/header.component';
|
||||
import { HomeComponent } from './components/home/home.component';
|
||||
import { LogoComponent } from './components/logo/logo.component';
|
||||
import { NavigationComponent } from './components/sibebar/navigation/navigation.component';
|
||||
import { throwIfAlreadyLoaded } from './guards/module-import.guard';
|
||||
import { SharedModule } from '../shared/shared.module';
|
||||
import { DialogModule } from 'primeng/dialog';
|
||||
|
||||
@NgModule({
|
||||
declarations: [HomeComponent, LogoComponent, NavigationComponent],
|
||||
imports: [CommonModule, FormsModule, RouterModule, TranslateModule, SharedModule, DialogModule],
|
||||
exports: [NavigationComponent, LogoComponent],
|
||||
declarations: [FooterComponent, HeaderComponent, HomeComponent, LogoComponent, NavigationComponent],
|
||||
imports: [CommonModule, FormsModule, RouterModule, TranslateModule, SharedModule],
|
||||
exports: [HeaderComponent, FooterComponent, NavigationComponent, LogoComponent],
|
||||
})
|
||||
export class CoreModule {
|
||||
constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
export enum Answer {
|
||||
YES = 'yes',
|
||||
NO = 'no',
|
||||
MAYBE = 'maybe',
|
||||
YES = 'YES',
|
||||
NO = 'NO',
|
||||
MAYBE = 'MAYBE',
|
||||
}
|
||||
|
@ -1,21 +1,15 @@
|
||||
/**
|
||||
* liste des fichiers JSON de traduction des textes dans l'appli à charger par ngx-translate et prposer aux utilisateurs et utilisatrices de Framdate.
|
||||
* Cette enum est utilisé dans le composant de sélection de langue.
|
||||
*/
|
||||
export enum LanguageEnum {
|
||||
ar = 'ar',
|
||||
br = 'br',
|
||||
ca = 'ca',
|
||||
de = 'de',
|
||||
en = 'en',
|
||||
eo = 'eo',
|
||||
es = 'es',
|
||||
fr = 'fr',
|
||||
gl = 'gl',
|
||||
hu = 'hu',
|
||||
it = 'it',
|
||||
ja = 'ja',
|
||||
nl = 'nl',
|
||||
oc = 'oc',
|
||||
sv = 'sv',
|
||||
export enum Language {
|
||||
FR = 'fr',
|
||||
// BR = 'br',
|
||||
// CA = 'ca',
|
||||
// DE = 'de',
|
||||
// EL = 'el',
|
||||
EN = 'en',
|
||||
// ES = 'es',
|
||||
// GL = 'gl',
|
||||
// HU = 'hu',
|
||||
// IT = 'it',
|
||||
// NL = 'nl',
|
||||
// OC = 'oc',
|
||||
// SV = 'sv',
|
||||
}
|
||||
|
@ -1,36 +1,14 @@
|
||||
import { Answer } from '../enums/answer.enum';
|
||||
import { Owner } from './owner.model';
|
||||
import { User } from './user.model';
|
||||
|
||||
export class ChoiceGroup {
|
||||
date_string: string;
|
||||
subSetToYes = false; // to know if all the choices are set to YES, to toggle them all at once without checking them individually
|
||||
choices: Choice[];
|
||||
}
|
||||
export class AnswerStats {
|
||||
count: number;
|
||||
people: Array<string>;
|
||||
}
|
||||
export class ChoiceText {
|
||||
public name: string; // text of the choice, displayed as an option
|
||||
public url_href: string; // url used as clickable link on a picture
|
||||
public url_display: string; // url to fetch a picture to display, this picture might be clickable with url_href filled
|
||||
}
|
||||
export class Choice {
|
||||
public id: number;
|
||||
public name: string;
|
||||
public created_at: string;
|
||||
public score: number;
|
||||
public enabled: boolean;
|
||||
public url?: string;
|
||||
public yes?: AnswerStats;
|
||||
public no?: AnswerStats;
|
||||
public maybe?: AnswerStats;
|
||||
|
||||
constructor(
|
||||
public participants: Map<Answer, Set<Owner>> = new Map<Answer, Set<Owner>>([
|
||||
[Answer.YES, new Set<Owner>()],
|
||||
[Answer.NO, new Set<Owner>()],
|
||||
[Answer.MAYBE, new Set<Owner>()],
|
||||
public label: string,
|
||||
public imageUrl?: string,
|
||||
public participants: Map<Answer, Set<User>> = new Map<Answer, Set<User>>([
|
||||
[Answer.YES, new Set<User>()],
|
||||
[Answer.NO, new Set<User>()],
|
||||
[Answer.MAYBE, new Set<User>()],
|
||||
]),
|
||||
public counts: Map<Answer, number> = new Map<Answer, number>([
|
||||
[Answer.YES, 0],
|
||||
@ -39,13 +17,13 @@ export class Choice {
|
||||
])
|
||||
) {}
|
||||
|
||||
public updateParticipation(user: Owner, responseType: Answer): void {
|
||||
public updateParticipation(user: User, responseType: Answer): void {
|
||||
this.removeParticipant(user);
|
||||
this.participants.get(responseType).add(user);
|
||||
this.updateCounts();
|
||||
}
|
||||
|
||||
public removeParticipant(user: Owner): void {
|
||||
public removeParticipant(user: User): void {
|
||||
for (const responseType of Object.values(Answer)) {
|
||||
if (this.participants.get(responseType).has(user)) {
|
||||
this.participants.get(responseType).delete(user);
|
||||
|
@ -1,18 +1,11 @@
|
||||
export interface CommentDTO {
|
||||
pseudo: string;
|
||||
text: string;
|
||||
}
|
||||
export class Comment {
|
||||
constructor(public id: string, public text: string, public pseudo: string, public created_at: string) {}
|
||||
constructor(public author: string, public content: string, public dateCreated: Date) {}
|
||||
|
||||
public static sortChronologically(first: Comment, second: Comment): number {
|
||||
const a = new Date(first.created_at);
|
||||
const b = new Date(second.created_at);
|
||||
|
||||
if (a < b) {
|
||||
public static sortChronologically(a: Comment, b: Comment): number {
|
||||
if (a.dateCreated < b.dateCreated) {
|
||||
return -1;
|
||||
}
|
||||
if (a > b) {
|
||||
if (a.dateCreated > b.dateCreated) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -15,10 +15,10 @@ export class PollConfiguration {
|
||||
public isOwnerNotifiedByEmailOnNewComment: boolean = false,
|
||||
public isZeroKnoledge: boolean = true,
|
||||
public hasSeveralHours: boolean = false,
|
||||
public hasMaxCountOfAnswers: boolean = true,
|
||||
public hasMaxCountOfAnswers: boolean = false,
|
||||
public whoCanChangeAnswers: string = environment.poll.defaultConfig.whoCanChangeAnswers, // everybody, self, nobody (= just admin)
|
||||
public visibility: string = environment.poll.defaultConfig.visibility, // visible to anyone with the link:
|
||||
public voteChoices: string = environment.poll.defaultConfig.voteChoices, // possible answers to a vote timeSlice: only "yes", "yes, maybe, no": number = environment.poll.defaultConfig.maxCountOfAnswers,
|
||||
public voteChoices: string = environment.poll.defaultConfig.voteChoices, // possible answers to a vote choice: only "yes", "yes, maybe, no": number = environment.poll.defaultConfig.maxCountOfAnswers,
|
||||
public maxCountOfAnswers: number = environment.poll.defaultConfig.maxCountOfAnswers,
|
||||
public expiresDaysDelay: number = environment.poll.defaultConfig.expiresDaysDelay,
|
||||
public expiracyAfterLastModificationInDays: number = environment.poll.defaultConfig
|
||||
|
@ -1,20 +0,0 @@
|
||||
export interface DateChoice {
|
||||
literal: string;
|
||||
timeSlices: TimeSlices[];
|
||||
date_object: Date;
|
||||
date_input: string;
|
||||
}
|
||||
|
||||
export interface TimeSlices {
|
||||
literal: string;
|
||||
}
|
||||
|
||||
export const timeSlicesProposals: TimeSlices[] = [
|
||||
{ literal: 'matin' },
|
||||
// { literal: 'midi' },
|
||||
// { literal: 'après-midi' },
|
||||
// { literal: 'soir' },
|
||||
// { literal: 'aux aurores' },
|
||||
// { literal: 'au petit dej' },
|
||||
// { literal: 'au deuxième petit dej des hobbits' },
|
||||
];
|
@ -1,13 +0,0 @@
|
||||
import { UserRole } from '../enums/user-role.enum';
|
||||
import { Poll } from './poll.model';
|
||||
|
||||
export class Owner {
|
||||
constructor(
|
||||
public pseudo: string = '',
|
||||
public email: string = '',
|
||||
public polls: Poll[] = [],
|
||||
public role: UserRole = UserRole.ADMIN,
|
||||
public modifier_token: string = '',
|
||||
public created_at: string = new Date().toISOString()
|
||||
) {}
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
import { Choice, ChoiceGroup } from './choice.model';
|
||||
import { DateChoice, TimeSlices } from './dateChoice.model';
|
||||
|
||||
export class PollDTO {
|
||||
adminKey; // key to change config of the poll
|
||||
allowSeveralHours;
|
||||
answers;
|
||||
canModifyAnswers; // bool for the frontend selector
|
||||
created_at;
|
||||
currentPoll; // current poll selected with createPoll or getPoll of ConfigService
|
||||
custom_url; // custom slug in the url; must be unique
|
||||
customUrlIsUnique; // given by the backend
|
||||
dateList; // sets of days as strings; config to set identical time for days in a special days poll
|
||||
deletionDateAfterLastModification;
|
||||
description;
|
||||
displayConfirmVoteModalAdmin;
|
||||
default_expiracy_days_from_now;
|
||||
expirationDate; // expiracy date
|
||||
isAdmin; // when we create a poll; we are admin on it
|
||||
kind: string;
|
||||
myComment = '';
|
||||
myEmail;
|
||||
myName;
|
||||
myPolls; // list of retrieved polls from the backend api
|
||||
myTempVoteStack;
|
||||
myVoteStack;
|
||||
owner_modifier_token; // key to change a vote stack
|
||||
password;
|
||||
passwordAccess;
|
||||
pollId; // id of the current poll when created. data given by the backend api
|
||||
pollSlug; // id of the current poll when created. data given by the backend api
|
||||
pollType: string = 'date'; // classic or dates
|
||||
timeList; // ranges of time expressed as strings
|
||||
title;
|
||||
urlAdmin;
|
||||
urlPublic;
|
||||
urlSlugPublic;
|
||||
visibility; // visible to one with the link:
|
||||
voteChoices = 'yes; maybe; no'; // possible answers to a vote timeSlice: only "yes"; "yes; maybe; no"
|
||||
voteStackId; // id of the vote stack to update
|
||||
whoCanChangeAnswers; // everybody; self; nobody (: just admin)
|
||||
whoModifiesAnswers; // everybody; self; nobody (: just admin)
|
||||
|
||||
constructor() {}
|
||||
}
|
@ -1,47 +1,58 @@
|
||||
import { Choice, ChoiceGroup, ChoiceText } from './choice.model';
|
||||
import { environment } from 'src/environments/environment';
|
||||
|
||||
import { Choice } from './choice.model';
|
||||
import { Comment } from './comment.model';
|
||||
import { Owner } from './owner.model';
|
||||
import { DateChoice, TimeSlices } from './dateChoice.model';
|
||||
import { defaultTimeOfDay } from '../../../../mocks/old-stuff/config/defaultConfigs';
|
||||
import { PollConfiguration } from './configuration.model';
|
||||
import { User } from './user.model';
|
||||
|
||||
export class Poll {
|
||||
public admin_key: string;
|
||||
public allow_comments?: boolean = true;
|
||||
public allowComments?: boolean = true;
|
||||
public allowed_answers = ['yes', 'maybe', 'no'];
|
||||
public allowSeveralHours?: boolean;
|
||||
public archiveNumberOfDays?: number;
|
||||
public areResultsPublic?: boolean = true;
|
||||
public choices: Choice[] = [];
|
||||
public choicesText: ChoiceText[] = [];
|
||||
public choices_grouped: ChoiceGroup[] = [];
|
||||
public comments: Comment[] = [];
|
||||
public creation_date?: string = new Date().toISOString();
|
||||
public creatorEmail?: string;
|
||||
public creatorPseudo?: string;
|
||||
public dateChoices: DateChoice[] = [];
|
||||
public default_expiracy_days_from_now = 60;
|
||||
public description?: string;
|
||||
public expiracy_date?: string;
|
||||
public has_several_hours?: boolean = false;
|
||||
public hasSeveralHours?: boolean = false;
|
||||
public id = 0;
|
||||
public is_archived?: boolean;
|
||||
public isMaybeAnswerAvailable?: boolean = true;
|
||||
public isOwnerNotifiedByEmailOnNewComment?: boolean = true;
|
||||
public isOwnerNotifiedByEmailOnNewVote?: boolean = true;
|
||||
public is_zero_knowledge?: boolean = false;
|
||||
public kind = 'date';
|
||||
public hideResults = false;
|
||||
public max_count_of_answers?: number = 150;
|
||||
public maxCountOfAnswers?: number = 150;
|
||||
public max_score?: number;
|
||||
public modification_policy = 'everybody';
|
||||
public password?: string;
|
||||
public stacks = [];
|
||||
public timeSlices: TimeSlices[] = Object.create(defaultTimeOfDay); // ranges of time expressed as strings
|
||||
public votes = [];
|
||||
public votes_allowed: boolean = true;
|
||||
constructor(
|
||||
public owner: User = new User(),
|
||||
public slug: string = '',
|
||||
public title: string = '',
|
||||
public description?: string,
|
||||
public creatorPseudo?: string,
|
||||
public creatorEmail?: string,
|
||||
public allowSeveralHours?: boolean,
|
||||
public archiveNumberOfDays?: number,
|
||||
public configuration: PollConfiguration = new PollConfiguration(),
|
||||
public comments: Comment[] = [],
|
||||
public choices: Choice[] = [],
|
||||
public dateChoices: Choice[] = [], // sets of days as strings, config to set identical time for days in a special days poll
|
||||
public timeChoices: Choice[] = [] // ranges of time expressed as strings
|
||||
) {}
|
||||
|
||||
constructor(public owner: Owner = new Owner(), public title = 'mon titre', public custom_url: string = '') {}
|
||||
public getAdministrationUrl(): string {
|
||||
return `${environment.api.baseHref}/administration/polls/${this.slug}`;
|
||||
}
|
||||
|
||||
public getParticipationUrl(): string {
|
||||
return `${environment.api.baseHref}/participation/polls/${this.slug}`;
|
||||
}
|
||||
|
||||
public static adaptFromLocalJsonServer(
|
||||
item: Pick<Poll, 'owner' | 'title' | 'description' | 'slug' | 'configuration' | 'comments' | 'choices'>
|
||||
): Poll {
|
||||
return new Poll(
|
||||
new User(item.owner.pseudo, item.owner.email, undefined),
|
||||
item.slug,
|
||||
item.title,
|
||||
item.description
|
||||
// item.configuration,
|
||||
// item.comments
|
||||
// .map(
|
||||
// (c: Pick<Comment, 'author' | 'content' | 'dateCreated'>) =>
|
||||
// new Comment(c.author, c.content, new Date(c.dateCreated))
|
||||
// )
|
||||
// .sort(Comment.sortChronologically),
|
||||
// item.choices.map((c: Pick<Choice, 'label' | 'imageUrl' | 'participants' | 'counts'>) => {
|
||||
// const choice = new Choice(c.label, c.imageUrl, new Map(c.participants));
|
||||
// choice.participants.forEach((value, key) => {
|
||||
// choice.participants.set(key, new Set(value));
|
||||
// });
|
||||
// choice.updateCounts();
|
||||
// return choice;
|
||||
// })
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +0,0 @@
|
||||
import { Vote } from './vote.model';
|
||||
import { Owner } from './owner.model';
|
||||
|
||||
export class Stack {
|
||||
public id: number;
|
||||
public custom_url: string;
|
||||
public pass_hash: string;
|
||||
public pseudo = 'Choque Nourrice';
|
||||
public comment = 'Le beau commentaire tout neuf';
|
||||
public owner: Owner = new Owner();
|
||||
public votes: Vote[] = [];
|
||||
}
|
12
src/app/core/models/user.model.ts
Normal file
@ -0,0 +1,12 @@
|
||||
import { UserRole } from '../enums/user-role.enum';
|
||||
import { Poll } from './poll.model';
|
||||
|
||||
export class User {
|
||||
constructor(
|
||||
public pseudo: string = 'pseudo',
|
||||
public email: string = 'example@example.com',
|
||||
public polls: Poll[] = [],
|
||||
public role?: UserRole,
|
||||
public token?: string
|
||||
) {}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
export class Vote {
|
||||
public choice_id: number = 0;
|
||||
public value: string = ''; // valeur de réponse
|
||||
|
||||
constructor(choice_id?, value?) {
|
||||
if (choice_id) {
|
||||
this.choice_id = choice_id;
|
||||
}
|
||||
if (value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,30 +1,28 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { AxiosInstance, AxiosResponse } from 'axios';
|
||||
import axios, { AxiosInstance, AxiosResponse } from 'axios';
|
||||
import { environment } from 'src/environments/environment';
|
||||
|
||||
import { Answer } from '../enums/answer.enum';
|
||||
import { Poll } from '../models/poll.model';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { ToastService } from './toast.service';
|
||||
import { LoaderService } from './loader.service';
|
||||
import { Stack } from '../models/stack.model';
|
||||
import { Comment, CommentDTO } from '../models/comment.model';
|
||||
|
||||
const apiVersion = environment.api.versionToUse;
|
||||
const currentApiRoutes = environment.api.version[apiVersion];
|
||||
const apiBaseHref = environment.api.version[apiVersion].baseHref;
|
||||
|
||||
const apiEndpoints = environment.api.endpoints;
|
||||
let axios = require('axios');
|
||||
|
||||
class PollDTO {}
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class ApiService {
|
||||
private useDevLocalServer = true;
|
||||
private devLocalServerBaseHref = 'http://localhost:8000/';
|
||||
private axiosInstance: AxiosInstance;
|
||||
|
||||
private readonly pollsEndpoint = apiEndpoints.polls.name;
|
||||
private readonly answersEndpoint = apiEndpoints.polls.answers.name;
|
||||
private readonly commentsEndpoint = apiEndpoints.polls.comments.name;
|
||||
@ -32,26 +30,16 @@ export class ApiService {
|
||||
private readonly usersEndpoint = apiEndpoints.users.name;
|
||||
private readonly usersPollsEndpoint = apiEndpoints.users.polls.name;
|
||||
private readonly usersPollsSendEmailEndpoint = apiEndpoints.users.polls.sendEmail.name;
|
||||
private baseHref: string;
|
||||
private static loaderService: LoaderService;
|
||||
|
||||
constructor(private http: HttpClient, private toastService: ToastService, private loaderService: LoaderService) {
|
||||
this.baseHref = apiBaseHref;
|
||||
private static loader: LoaderService;
|
||||
|
||||
constructor(private http: HttpClient, private loader: LoaderService, private toastService: ToastService) {
|
||||
this.axiosInstance = axios.create({ baseURL: apiBaseHref });
|
||||
this.axiosInstance.defaults.timeout = 2500;
|
||||
// this.axiosInstance.defaults.headers.post['Content-Type'] = 'application/json';
|
||||
// this.axiosInstance.defaults.headers.post['Accept'] = 'application/json';
|
||||
// this.axiosInstance.defaults.headers.post['Charset'] = 'UTF-8';
|
||||
// this.axiosInstance.defaults.headers.post['Accept-Charset'] = 'UTF-8';
|
||||
// this.axiosInstance.defaults.headers.post['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';
|
||||
// this.axiosInstance.defaults.headers.post['Referrer-Policy'] = 'origin-when-cross-origin';
|
||||
// this.axiosInstance.defaults.headers.post['Access-Control-Allow-Origin'] = '*';
|
||||
// this.axiosInstance.defaults.headers.post['Control-Allow-Origin'] = '*';
|
||||
// this.axiosInstance.defaults.headers.post['Allow-Origin'] = '*';
|
||||
// this.axiosInstance.defaults.headers.post['Access-Control-Allow-Headers'] =
|
||||
// 'Origin, X-Requested-With, Content-Type, Accept';
|
||||
|
||||
this.axiosInstance.defaults.headers.post['Content-Type'] = 'application/json';
|
||||
this.axiosInstance.defaults.headers.post['Accept'] = 'application/json';
|
||||
this.axiosInstance.defaults.headers.post['Charset'] = 'UTF-8';
|
||||
this.axiosInstance.defaults.headers.post['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';
|
||||
this.axiosInstance.defaults.headers.post['Access-Control-Allow-Origin'] = '*';
|
||||
console.log('this.axiosInstance.defaults.headers', this.axiosInstance.defaults.headers);
|
||||
}
|
||||
|
||||
@ -59,71 +47,37 @@ export class ApiService {
|
||||
// CREATE OR UPDATE //
|
||||
//////////////////////
|
||||
|
||||
/////////////////////
|
||||
/**
|
||||
* prepare headers like the charset and json type for any call to the backend
|
||||
* @param bodyContent?
|
||||
*/
|
||||
static makeHeaders(bodyContent?: any) {
|
||||
const headerDict = {
|
||||
Charset: 'UTF-8',
|
||||
// 'Content-Type': 'application/json',
|
||||
// Accept: 'application/json',
|
||||
'Access-Control-Allow-Origin': '^https?://(localhost|127.0.0.1)(:[0-9]+)?$',
|
||||
'Content-Type': 'application/json',
|
||||
// mode: 'no-cors',
|
||||
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Accept,Accept-LanguageEnum,Content-LanguageEnum,Content-Type',
|
||||
};
|
||||
const headersAxios = {
|
||||
headers: headerDict,
|
||||
body: bodyContent,
|
||||
};
|
||||
console.log('headersAxios', headersAxios);
|
||||
return headersAxios;
|
||||
public async createPoll(poll: Poll): Promise<Subscription> {
|
||||
// this.loader.setStatus(true);
|
||||
console.log('createPoll config', poll);
|
||||
// const baseHref = this.useDevLocalServer ? 'http://localhost:8000' : apiBaseHref;
|
||||
// return this.http
|
||||
// .post(`${baseHref}${currentApiRoutes['api_new_poll']}`, poll, ApiService.makeHeaders())
|
||||
// .subscribe(
|
||||
// (res: Observable<any>) => {
|
||||
// // redirect to the page to administrate the new poll
|
||||
// this.toastService.display('Sondage Créé');
|
||||
//
|
||||
// console.log('res', res);
|
||||
// // this.updateCurrentPollFromResponse(res);
|
||||
//
|
||||
// this.loader.setStatus(false);
|
||||
// },
|
||||
// (e) => {
|
||||
// ApiService.handleError(e);
|
||||
// }
|
||||
// );
|
||||
|
||||
try {
|
||||
console.log('currentApiRoutes', currentApiRoutes);
|
||||
return await this.axiosInstance.post(`${apiBaseHref}${currentApiRoutes['api_new_poll']}`, {
|
||||
data: poll,
|
||||
});
|
||||
} catch (error) {
|
||||
ApiService.handleError(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* create a new poll
|
||||
* @param poll
|
||||
*/
|
||||
public async createPoll(poll: PollDTO): Promise<Subscription> {
|
||||
// this.loaderService.setStatus(true);
|
||||
|
||||
let axiosConf = {
|
||||
method: 'post',
|
||||
url: `${this.baseHref}${currentApiRoutes['api_new_poll']}`,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
data: JSON.stringify(poll),
|
||||
};
|
||||
console.log('apiservice createPoll config', poll);
|
||||
|
||||
return this.axiosInstance.post(`${this.baseHref}${currentApiRoutes['api_new_poll']}`, poll);
|
||||
}
|
||||
|
||||
/**
|
||||
* send a new vote stack
|
||||
* @param vote_stack
|
||||
*/
|
||||
public sendNewVoteStackOfPoll(vote_stack: Stack): Promise<void> {
|
||||
// const headers = ApiService.makeHeaders(vote_stack);
|
||||
const url = `${this.baseHref}/vote-stack/`;
|
||||
|
||||
// const axiosconf = {
|
||||
// url,
|
||||
// method: 'POST',
|
||||
// body: vote_stack,
|
||||
// headers,
|
||||
// };
|
||||
|
||||
return this.axiosInstance.post(url, vote_stack);
|
||||
}
|
||||
|
||||
//////////
|
||||
// READ //
|
||||
|
||||
public async createParticipation(
|
||||
pollId: string,
|
||||
choiceLabel: string,
|
||||
@ -141,22 +95,20 @@ export class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
public createComment(slug: string, comment: Comment | CommentDTO): Promise<string> {
|
||||
public async createComment(slug: string, comment: string): Promise<string> {
|
||||
try {
|
||||
return this.axiosInstance.post(`${this.baseHref}/comment/poll/${slug}`, comment);
|
||||
return await this.axiosInstance.post(`${this.pollsEndpoint}/${slug}${this.commentsEndpoint}`, comment);
|
||||
} catch (error) {
|
||||
ApiService.handleError(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get all polls published by the API
|
||||
*/
|
||||
//////////
|
||||
// READ //
|
||||
//////////
|
||||
public async getAllAvailablePolls(): Promise<Poll[]> {
|
||||
// TODO: used for facilities in DEV, should be removed in production
|
||||
try {
|
||||
this.axiosInstance.options(this.pollsEndpoint);
|
||||
|
||||
const response: AxiosResponse<Poll[]> = await this.axiosInstance.get<Poll[]>(`${this.pollsEndpoint}`);
|
||||
return response?.data;
|
||||
} catch (error) {
|
||||
@ -164,32 +116,27 @@ export class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get one poll by its admin key
|
||||
* @param admin_key
|
||||
*/
|
||||
public async getPollByAdminKey(admin_key: string): Promise<any | undefined> {
|
||||
public async getPollBySlug(slug: string): Promise<Poll | undefined> {
|
||||
// TODO: identifier should be decided according to backend : Id || Slug ?
|
||||
try {
|
||||
console.log('fetch API : asking for poll with admin_key=' + admin_key);
|
||||
const response: AxiosResponse<Poll> = await this.axiosInstance.get<any>(
|
||||
`${this.pollsEndpoint}/admin/${admin_key}`
|
||||
// TODO: this interceptor should be avoided if backends returns the good object
|
||||
const adapterInterceptor: number = this.axiosInstance.interceptors.response.use(
|
||||
(response: AxiosResponse): AxiosResponse => {
|
||||
if (response.data['poll']) {
|
||||
// response from cipherbliss backend, actually used by oldstuffModule
|
||||
response.data = response.data['poll'];
|
||||
} else if (response.data[0] && response.data[0]['slug'] && response.data[0]['question']) {
|
||||
// response from local json-server
|
||||
response.data = Poll.adaptFromLocalJsonServer(response.data[0]);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
);
|
||||
return response && response.data && !Array.isArray(response.data) ? response.data : undefined;
|
||||
} catch (error) {
|
||||
if (error.response?.status === 404) {
|
||||
return undefined;
|
||||
} else {
|
||||
ApiService.handleError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async getPollByCustomUrl(custom_url: string): Promise<Poll | undefined> {
|
||||
try {
|
||||
console.log('fetch API : asking for poll with custom_url=' + custom_url);
|
||||
const response: AxiosResponse<Poll> = await this.axiosInstance.get<Poll>(
|
||||
`${this.pollsEndpoint}/${custom_url}`
|
||||
);
|
||||
const response: AxiosResponse<Poll> = await this.axiosInstance.get<Poll>(`${this.pollsEndpoint}/${slug}`);
|
||||
console.log('fetch API : asking for poll with slug=' + slug, { response });
|
||||
|
||||
axios.interceptors.request.eject(adapterInterceptor);
|
||||
|
||||
return response && response.data && !Array.isArray(response.data) ? response.data : undefined;
|
||||
} catch (error) {
|
||||
@ -201,30 +148,11 @@ export class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
public async getPollByCustomUrlWithHash(custom_url: string, hash: string): Promise<Poll | undefined> {
|
||||
public async getSlug(slug: string): Promise<boolean> {
|
||||
try {
|
||||
const response: AxiosResponse<Poll> = await this.axiosInstance.get<Poll>(
|
||||
`${this.pollsEndpoint}/${custom_url}/pass/${hash}`
|
||||
);
|
||||
console.log('fetch API : asking for poll with custom_url=' + custom_url, { response });
|
||||
|
||||
return response && response.data && !Array.isArray(response.data) ? response.data : undefined;
|
||||
} catch (error) {
|
||||
if (error.response?.status === 404) {
|
||||
return undefined;
|
||||
} else if (error.response?.status === 403) {
|
||||
return error;
|
||||
} else {
|
||||
ApiService.handleError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async getSlug(custom_url: string): Promise<boolean> {
|
||||
try {
|
||||
// TODO: scenario should be : if we can get this custom_url, it exists. if not, it doesn't. It's just a GET.
|
||||
// TODO: scenario should be : if we can get this slug, it exists. if not, it doesn't. It's just a GET.
|
||||
const response: AxiosResponse = await this.axiosInstance.get(
|
||||
`${this.pollsEndpoint}${this.slugsEndpoint}/${custom_url}`
|
||||
`${this.pollsEndpoint}${this.slugsEndpoint}/${slug}`
|
||||
);
|
||||
if (response?.status !== 404) {
|
||||
return false;
|
||||
@ -238,27 +166,37 @@ export class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
////////////
|
||||
// UPDATE //
|
||||
////////////
|
||||
public async sendUpdateVoteStack(vote_stack: Stack) {
|
||||
public async sendEmailToUserOfItsPollsList(email: string): Promise<void> {
|
||||
// If user is not authenticated: the list of polls is send to user's email by the backend.
|
||||
try {
|
||||
return await this.axiosInstance.patch(
|
||||
`${this.baseHref}/vote-stack/${vote_stack.id}/token/${vote_stack.owner.modifier_token}`,
|
||||
vote_stack
|
||||
await this.axiosInstance.get<Poll[]>(
|
||||
`${this.usersEndpoint}/${email}${this.usersPollsEndpoint}${this.usersPollsSendEmailEndpoint}`
|
||||
);
|
||||
} catch (error) {
|
||||
ApiService.handleError(error);
|
||||
}
|
||||
}
|
||||
|
||||
public findMyPollsByEmail(email: string): Promise<any> {
|
||||
return this.axiosInstance.get<any>(`${this.baseHref}/poll/owner/${email}`);
|
||||
public async getPollsUrlsByUserEmail(email: string): Promise<Poll[]> {
|
||||
// If user is authenticated : retrieve polls & display directly in frontend.
|
||||
// TODO: Backend should handle this case. Actually the endpoint doesn't exist in backend.
|
||||
// Here, only the list of slugs is usefull. Maybe just handle the list of slugs.
|
||||
try {
|
||||
const response: AxiosResponse<Poll[]> = await this.axiosInstance.get<Poll[]>(
|
||||
`${this.usersEndpoint}/${email}${this.usersPollsEndpoint}`
|
||||
);
|
||||
return response?.data;
|
||||
} catch (error) {
|
||||
ApiService.handleError(error);
|
||||
}
|
||||
}
|
||||
|
||||
////////////
|
||||
// UPDATE //
|
||||
////////////
|
||||
public async updateAnswer(slug: string, choiceLabel: string, pseudo: string, answer: Answer): Promise<string> {
|
||||
try {
|
||||
return await this.axiosInstance.patch(`${this.baseHref}/${slug}${this.answersEndpoint}`, {
|
||||
return await this.axiosInstance.patch(`${this.pollsEndpoint}/${slug}${this.answersEndpoint}`, {
|
||||
choiceLabel,
|
||||
pseudo,
|
||||
answer,
|
||||
@ -270,9 +208,6 @@ export class ApiService {
|
||||
|
||||
////////////
|
||||
// DELETE //
|
||||
|
||||
////////////
|
||||
|
||||
////////////
|
||||
public async deletePoll(slug: string): Promise<boolean> {
|
||||
try {
|
||||
@ -294,9 +229,11 @@ export class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
public async deletePollComments(admin_key: string): Promise<boolean> {
|
||||
public async deletePollComments(slug: string): Promise<boolean> {
|
||||
try {
|
||||
const response: AxiosResponse = await this.axiosInstance.delete(`${this.pollsEndpoint}/${admin_key}`);
|
||||
const response: AxiosResponse = await this.axiosInstance.delete(
|
||||
`${this.pollsEndpoint}/${slug}${this.commentsEndpoint}`
|
||||
);
|
||||
return response?.status === 204;
|
||||
} catch (error) {
|
||||
ApiService.handleError(error);
|
||||
@ -306,45 +243,45 @@ export class ApiService {
|
||||
/////////////////////
|
||||
// PRIVATE METHODS //
|
||||
/////////////////////
|
||||
private static handleError(error): void {
|
||||
// this.loaderService.setStatus(true);
|
||||
if (error.response) {
|
||||
// The request was made and the server responded with a status code
|
||||
// that falls out of the range of 2xx
|
||||
console.error('Error response data', error.response.data);
|
||||
console.error('Error response status', error.response.status);
|
||||
console.error('Error response headers', error.response.headers);
|
||||
} else if (error.request) {
|
||||
// The request was made but no response was received
|
||||
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
|
||||
// http.ClientRequest in node.js
|
||||
console.log('ErrorRequest', error.request);
|
||||
} else {
|
||||
// Something happened in setting up the request that triggered an Error
|
||||
console.log('Error', error.message);
|
||||
}
|
||||
console.log(error.config);
|
||||
// this.loaderService.setStatus(false);
|
||||
/**
|
||||
* prepare headers like the charset and json type for any call to the backend
|
||||
* @param bodyContent?
|
||||
*/
|
||||
static makeHeaders(bodyContent?: any) {
|
||||
const headerDict = {
|
||||
Charset: 'UTF-8',
|
||||
'Content-Type': 'application/json',
|
||||
Accept: 'application/json',
|
||||
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Accept,Accept-Language,Content-Language,Content-Type',
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
};
|
||||
|
||||
const requestOptions = {
|
||||
headers: new HttpHeaders(headerDict),
|
||||
body: bodyContent,
|
||||
};
|
||||
|
||||
return requestOptions;
|
||||
}
|
||||
|
||||
public ousideHandleError(error) {
|
||||
// this.loaderService.setStatus(true);
|
||||
private static handleError(error): void {
|
||||
// this.loader.setStatus(true);
|
||||
if (error.response) {
|
||||
// The request was made and the server responded with a status code
|
||||
// that falls out of the range of 2xx
|
||||
console.error('Error response data', error.response.data);
|
||||
console.error('Error response status', error.response.status);
|
||||
console.error('Error response headers', error.response.headers);
|
||||
console.log(error.response.data);
|
||||
console.log(error.response.status);
|
||||
console.log(error.response.headers);
|
||||
} else if (error.request) {
|
||||
// The request was made but no response was received
|
||||
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
|
||||
// http.ClientRequest in node.js
|
||||
console.log('ErrorRequest', error.request);
|
||||
console.log(error.request);
|
||||
} else {
|
||||
// Something happened in setting up the request that triggered an Error
|
||||
console.log('Error', error.message);
|
||||
}
|
||||
console.log(error.config);
|
||||
// this.loaderService.setStatus(false);
|
||||
}
|
||||
}
|
||||
|
@ -1,135 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { defaultTimeOfDay } from '../../../../mocks/old-stuff/config/defaultConfigs';
|
||||
import { DateChoice } from '../models/dateChoice.model';
|
||||
import { environment } from '../../../environments/environment';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class DateUtilitiesService {
|
||||
/**
|
||||
* add some dateChoices to a date, to compute intervals
|
||||
* @param days
|
||||
* @param date
|
||||
*/
|
||||
addDaysToDate(days: number, date: Date) {
|
||||
date = new Date(date.valueOf());
|
||||
date.setDate(date.getDate() + days);
|
||||
return date;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param d1
|
||||
* @param d2
|
||||
* @param interval
|
||||
*/
|
||||
getDatesInRange(d1: Date, d2: Date, interval: number) {
|
||||
d1 = new Date(d1);
|
||||
d2 = new Date(d2);
|
||||
const dates = [];
|
||||
while (+d1 < +d2) {
|
||||
dates.push({
|
||||
literal: this.formateDateToInputStringNg(d1),
|
||||
date_object: d1,
|
||||
});
|
||||
d1.setDate(d1.getDate() + interval);
|
||||
}
|
||||
return [...dates];
|
||||
}
|
||||
|
||||
/**
|
||||
* get the number of dateChoices between two dates
|
||||
* @param d1
|
||||
* @param d2
|
||||
*/
|
||||
dayDiff(d1: Date, d2: Date): any {
|
||||
const div = 1000 * 3600 * 24;
|
||||
return Math.abs((d2.getTime() - d1.getTime()) / div).toFixed(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* format a date object to the date format used by the inputs of type date
|
||||
* YYYY-MM-DD
|
||||
* @param date
|
||||
*/
|
||||
formateDateToInputStringNg(date: Date): string {
|
||||
return [
|
||||
date.getFullYear(),
|
||||
this.getDoubleDigits(date.getMonth() + 1),
|
||||
this.getDoubleDigits(date.getDate()),
|
||||
].join('-');
|
||||
}
|
||||
|
||||
/**
|
||||
* transform a date object to a short date string
|
||||
* @param inputDate
|
||||
*/
|
||||
parseInputDateToDateObject(inputDate: Date): Date {
|
||||
const boom = inputDate.toISOString().substring(0, 10).split('-');
|
||||
|
||||
const converted = new Date(boom['0'], boom['1'] - 1, boom['2']);
|
||||
console.log('converted', converted);
|
||||
return converted;
|
||||
}
|
||||
|
||||
/**
|
||||
* get double in string
|
||||
* @param str
|
||||
*/
|
||||
getDoubleDigits(str) {
|
||||
return ('00' + str).slice(-2);
|
||||
}
|
||||
|
||||
/**
|
||||
* compute the number of dateChoices in the date interval
|
||||
* @param startDateInterval
|
||||
* @param endDateInterval
|
||||
*/
|
||||
countDays(startDateInterval: Date, endDateInterval: Date): number {
|
||||
if (endDateInterval && startDateInterval) {
|
||||
return this.dayDiff(endDateInterval, startDateInterval);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
makeDefaultCalendarDateChoices(): Date[] {
|
||||
return [
|
||||
this.addDaysToDate(1, new Date()),
|
||||
this.addDaysToDate(2, new Date()),
|
||||
this.addDaysToDate(3, new Date()),
|
||||
];
|
||||
}
|
||||
/**
|
||||
* fill default dates for today + the next 3 dateChoices
|
||||
*/
|
||||
makeDefaultDateChoices(): DateChoice[] {
|
||||
const today = new Date();
|
||||
const ladate2 = this.addDaysToDate(1, today);
|
||||
const ladate3 = this.addDaysToDate(2, today);
|
||||
const ladate4 = this.addDaysToDate(3, today);
|
||||
|
||||
return [
|
||||
this.convertDateToDateChoiceObject(ladate2),
|
||||
this.convertDateToDateChoiceObject(ladate3),
|
||||
this.convertDateToDateChoiceObject(ladate4),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* convert a date to a DateChoice
|
||||
* @param date
|
||||
*/
|
||||
convertDateToDateChoiceObject(date: Date): DateChoice {
|
||||
let isUnder10 = date.getDate() < 10;
|
||||
let day = isUnder10 ? `0${date.getDate()}` : date.getDate();
|
||||
// get month is based on 0, so yeah
|
||||
let input = `${date.getFullYear()}-${date.getMonth() + 1}-${day}`;
|
||||
return {
|
||||
literal: this.formateDateToInputStringNg(date),
|
||||
timeSlices: environment.autofill_default_timeslices ? Object.create(defaultTimeOfDay) : [],
|
||||
date_object: date,
|
||||
date_input: input,
|
||||
};
|
||||
}
|
||||
}
|
@ -1,9 +1,8 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { LangChangeEvent, TranslateService } from '@ngx-translate/core';
|
||||
import { TranslateService, LangChangeEvent } from '@ngx-translate/core';
|
||||
|
||||
import { LanguageEnum } from '../enums/language.enum';
|
||||
import { Language } from '../enums/language.enum';
|
||||
import { StorageService } from './storage.service';
|
||||
import { environment } from '../../../environments/environment';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
@ -11,12 +10,12 @@ import { environment } from '../../../environments/environment';
|
||||
export class LanguageService {
|
||||
constructor(private translate: TranslateService, private storageService: StorageService) {}
|
||||
|
||||
public getLangage(): LanguageEnum {
|
||||
return this.translate.currentLang as LanguageEnum;
|
||||
public getLangage(): Language {
|
||||
return this.translate.currentLang as Language;
|
||||
}
|
||||
|
||||
public setLanguage(language: string): void {
|
||||
this.translate.use(language);
|
||||
public setLanguage(language: Language): void {
|
||||
this.translate.use(language.toString());
|
||||
}
|
||||
|
||||
public getAvailableLanguages(): string[] {
|
||||
@ -26,20 +25,16 @@ export class LanguageService {
|
||||
public configureAndInitTranslations(): void {
|
||||
// always save in storage the currentLang used
|
||||
this.translate.onLangChange.subscribe((event: LangChangeEvent) => {
|
||||
this.storageService.language = event.lang as LanguageEnum;
|
||||
this.storageService.language = event.lang as Language;
|
||||
});
|
||||
|
||||
// set all languages available
|
||||
this.translate.addLangs(Object.keys(LanguageEnum));
|
||||
this.translate.addLangs(Object.keys(Language));
|
||||
|
||||
// set language
|
||||
this.setLanguageOnInit();
|
||||
}
|
||||
|
||||
public getPrimeNgStrings() {
|
||||
return this.translate.get('calendar_widget');
|
||||
}
|
||||
|
||||
private setLanguageOnInit(): void {
|
||||
// set language from storage
|
||||
if (!this.translate.currentLang) {
|
||||
@ -53,18 +48,18 @@ export class LanguageService {
|
||||
|
||||
// set default language
|
||||
if (!this.translate.currentLang) {
|
||||
this.setLanguage(LanguageEnum[environment.defaultLanguage]);
|
||||
this.setLanguage(Language.FR);
|
||||
}
|
||||
}
|
||||
|
||||
private setLanguageFromStorage(): void {
|
||||
console.log('this.storageService.language', this.storageService.language);
|
||||
if (this.storageService.language && this.translate.getLangs().includes(this.storageService.language)) {
|
||||
this.setLanguage(this.storageService.language);
|
||||
}
|
||||
}
|
||||
|
||||
private setLanguageFromBrowser(): void {
|
||||
const currentBrowserLanguage: LanguageEnum = this.translate.getBrowserLang() as LanguageEnum;
|
||||
const currentBrowserLanguage: Language = this.translate.getBrowserLang().toUpperCase() as Language;
|
||||
console.log('currentBrowserLanguage', currentBrowserLanguage);
|
||||
if (this.translate.getLangs().includes(currentBrowserLanguage)) {
|
||||
this.setLanguage(currentBrowserLanguage);
|
||||
|
@ -1,6 +1,10 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
|
||||
import { UserRole } from '../enums/user-role.enum';
|
||||
import { Choice } from '../models/choice.model';
|
||||
import { Poll } from '../models/poll.model';
|
||||
import { User } from '../models/user.model';
|
||||
import { ApiService } from './api.service';
|
||||
import { UserService } from './user.service';
|
||||
import { UuidService } from './uuid.service';
|
||||
@ -14,7 +18,38 @@ export class MockingService {
|
||||
|
||||
constructor(private apiService: ApiService, private userService: UserService, private uuidService: UuidService) {}
|
||||
|
||||
public async init(): Promise<void> {}
|
||||
public async init(): Promise<void> {
|
||||
const pollsAvailable = await this.apiService.getAllAvailablePolls();
|
||||
this._pollsAvailables.next(pollsAvailable);
|
||||
|
||||
public loadMock(): void {}
|
||||
if (this._pollsAvailables.getValue() && this._pollsAvailables.getValue().length > 0) {
|
||||
// arbitrary choose first owner available
|
||||
const currentUser = this._pollsAvailables.getValue()[0].owner;
|
||||
currentUser.polls = [this._pollsAvailables.getValue()[0]];
|
||||
this.userService.updateUser(currentUser);
|
||||
} else {
|
||||
this.loadMock();
|
||||
}
|
||||
}
|
||||
|
||||
public loadMock(): void {
|
||||
const owner = new User('TOTO', 'toto@gafam.com', [], UserRole.REGISTERED);
|
||||
|
||||
const poll1: Poll = new Poll(owner, this.uuidService.getUUID(), 'Quand le picnic ?', 'Pour faire la teuf');
|
||||
const poll2: Poll = new Poll(
|
||||
owner,
|
||||
this.uuidService.getUUID(),
|
||||
'On fait quoi à la soirée ?',
|
||||
'Balancez vos idées'
|
||||
);
|
||||
|
||||
poll1.choices = [new Choice('mardi prochain'), new Choice('mercredi')];
|
||||
poll2.choices = [new Choice('jeux'), new Choice('danser'), new Choice('discuter en picolant')];
|
||||
|
||||
this._pollsAvailables.next([poll1, poll2]);
|
||||
owner.polls = [poll1, poll2];
|
||||
this.userService.updateUser(owner);
|
||||
|
||||
console.info('MOCKING user', { user: owner });
|
||||
}
|
||||
}
|
||||
|
@ -1,280 +1,60 @@
|
||||
import { Inject, Injectable } from '@angular/core';
|
||||
import { ActivatedRoute, ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router';
|
||||
import { BehaviorSubject, Observable, Subscription } from 'rxjs';
|
||||
|
||||
import { Answer } from '../enums/answer.enum';
|
||||
import { Choice } from '../models/choice.model';
|
||||
import { Poll } from '../models/poll.model';
|
||||
import { User } from '../models/user.model';
|
||||
import { ApiService } from './api.service';
|
||||
import { ToastService } from './toast.service';
|
||||
import { UserService } from './user.service';
|
||||
import { UuidService } from './uuid.service';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { environment } from '../../../environments/environment';
|
||||
import { StorageService } from './storage.service';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
|
||||
import { DOCUMENT } from '@angular/common';
|
||||
import { DateChoice, TimeSlices } from '../models/dateChoice.model';
|
||||
import { DateUtilitiesService } from './date.utilities.service';
|
||||
import { Owner } from '../models/owner.model';
|
||||
import { Stack } from '../models/stack.model';
|
||||
import { Vote } from '../models/vote.model';
|
||||
import { ClipboardService } from 'ngx-clipboard';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { CommentDTO } from '../models/comment.model';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class PollService implements Resolve<Poll> {
|
||||
public _poll: BehaviorSubject<Poll | undefined> = new BehaviorSubject<Poll | undefined>(undefined);
|
||||
private _poll: BehaviorSubject<Poll | undefined> = new BehaviorSubject<Poll | undefined>(undefined);
|
||||
public readonly poll: Observable<Poll | undefined> = this._poll.asObservable();
|
||||
public form: FormGroup;
|
||||
public startDateInterval: string;
|
||||
public endDateInterval: string;
|
||||
public intervalDays: number = 1;
|
||||
public intervalDaysDefault = 7;
|
||||
public dateChoiceList: DateChoice[] = []; // sets of days as strings, config to set identical time for days in a special days poll
|
||||
public timeList: TimeSlices[] = [{ literal: '' }]; // ranges of time expressed as strings
|
||||
public previousRouteName: string = '/administration';
|
||||
public nextRouteName: string = '/administration/step/2';
|
||||
public step_current: number = 1;
|
||||
public step_max: number = 7;
|
||||
public round: Function;
|
||||
public pass_hash: string;
|
||||
public admin_key: string;
|
||||
public urlPrefix: string = window.location.origin;
|
||||
public advancedDisplayEnabled = false;
|
||||
public showDateInterval = false;
|
||||
public allowSeveralHours = false;
|
||||
public richTextMode = false;
|
||||
public mode_calendar = true; // default input to select dates in creation step
|
||||
public calendar: Date[] = [];
|
||||
public disabled_dates: Date[] = [];
|
||||
|
||||
constructor(
|
||||
private http: HttpClient,
|
||||
private router: Router,
|
||||
private apiService: ApiService,
|
||||
private storageService: StorageService,
|
||||
private userService: UserService,
|
||||
private uuidService: UuidService,
|
||||
private toastService: ToastService,
|
||||
private titleService: Title,
|
||||
public DateUtilitiesService: DateUtilitiesService,
|
||||
public route: ActivatedRoute,
|
||||
private _clipboardService: ClipboardService,
|
||||
private translate: TranslateService,
|
||||
@Inject(DOCUMENT) private document: any,
|
||||
private fb: FormBuilder
|
||||
) {
|
||||
this.createFormGroup();
|
||||
|
||||
// disable days before today
|
||||
for (let i = 1; i < 31; i++) {
|
||||
this.disabled_dates.push(this.DateUtilitiesService.addDaysToDate(-i, new Date()));
|
||||
}
|
||||
if (environment.autofill_creation) {
|
||||
this.setDemoValues();
|
||||
// fill in the next 3 days of the calendar date picker
|
||||
this.calendar = this.DateUtilitiesService.makeDefaultCalendarDateChoices();
|
||||
this.dateChoiceList = this.DateUtilitiesService.makeDefaultDateChoices();
|
||||
}
|
||||
if (environment.autoSendNewPoll) {
|
||||
this.createPoll();
|
||||
}
|
||||
}
|
||||
|
||||
updateTitle() {
|
||||
let suppl = environment.production ? ' [DEV]' : '';
|
||||
let apptitle = environment.appTitle + suppl;
|
||||
let step_current;
|
||||
if (this.step_current) {
|
||||
// in creation tunnel
|
||||
let stepsTitle = {
|
||||
date: [
|
||||
'creation.title',
|
||||
'creation.want',
|
||||
'dates.title',
|
||||
'hours.title',
|
||||
'advanced.title',
|
||||
'owner.title',
|
||||
'resume.title',
|
||||
],
|
||||
text: [
|
||||
'creation.title',
|
||||
'creation.want',
|
||||
'dates.title',
|
||||
'hours.title',
|
||||
'advanced.title',
|
||||
'owner.title',
|
||||
'resume.title',
|
||||
],
|
||||
};
|
||||
|
||||
let kind = 'date';
|
||||
step_current = this.step_current | 1;
|
||||
if (this.form.value.isAboutDate) {
|
||||
kind = 'text';
|
||||
}
|
||||
let keyToTranslate = stepsTitle[kind][(step_current - 1) | 0];
|
||||
|
||||
this.translate.getTranslation(this.translate.getBrowserLang()).subscribe((response) => {
|
||||
let step = this.translate.getParsedResult(response, 'nav.step');
|
||||
let on = this.translate.getParsedResult(response, 'nav.on');
|
||||
let no_title = this.translate.getParsedResult(response, 'nav.no_title');
|
||||
let titleText = this.form.value.title ? ' - ' + this.form.value.title : no_title + ' -';
|
||||
let stepTitle = this.translate.getParsedResult(response, keyToTranslate);
|
||||
if (this.step_current == 1) {
|
||||
titleText = stepTitle;
|
||||
}
|
||||
console.log('a', step, this.translate.getBrowserCultureLang());
|
||||
let fullTitle = `${titleText} ${step} ${this.step_current} ${on} ${this.step_max} - ${environment.appTitle} `;
|
||||
console.log('fullTitle', fullTitle);
|
||||
// ex: Nom de mon sondage - étape 3 sur 7 - Framadate
|
||||
this.titleService.setTitle(fullTitle);
|
||||
});
|
||||
} else {
|
||||
this.titleService.setTitle(apptitle);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* add example values to the form for demo env
|
||||
*/
|
||||
setDemoValues(): void {
|
||||
this.form.patchValue({
|
||||
title: 'Mon titre de sondage du ' + this.DateUtilitiesService.formateDateToInputStringNg(new Date()),
|
||||
description: 'répondez SVP <3 ! *-* ',
|
||||
custom_url: this.uuidService.getUUID(),
|
||||
creatorPseudo: 'Chuck Norris',
|
||||
creatorEmail: 'chucknorris@example.com',
|
||||
isAboutDate: false,
|
||||
whoModifiesAnswers: 'everybody',
|
||||
whoCanChangeAnswers: 'everybody',
|
||||
isProtectedByPassword: false,
|
||||
richTextMode: false,
|
||||
areResultsPublic: true,
|
||||
expiresDaysDelay: environment.expiresDaysDelay,
|
||||
});
|
||||
this.automaticSlug();
|
||||
}
|
||||
|
||||
/**
|
||||
* set the poll slug from other data of the poll
|
||||
*/
|
||||
automaticSlug() {
|
||||
this.form.patchValue({ custom_url: this.makeSlug(this.form) });
|
||||
}
|
||||
|
||||
public createFormGroup() {
|
||||
let minlengthValidation = environment.production ? 12 : 0;
|
||||
let form = this.fb.group({
|
||||
title: ['', [Validators.required, Validators.minLength(minlengthValidation)]],
|
||||
creatorPseudo: ['', []],
|
||||
created_at: [new Date(), [Validators.required]],
|
||||
creatorEmail: ['', [environment.creation_email_is_required ? Validators.required : null]],
|
||||
custom_url: [this.uuidService.getUUID(), [Validators.required]],
|
||||
description: ['', []],
|
||||
password: ['', []],
|
||||
password_repeat: ['', []],
|
||||
choices: new FormArray([]),
|
||||
whoModifiesAnswers: ['self', [Validators.required]],
|
||||
whoCanChangeAnswers: ['self', [Validators.required]],
|
||||
isAboutDate: [false, [Validators.required]],
|
||||
expiresDaysDelay: [environment.expiresDaysDelay, []],
|
||||
expiracy_date: [this.DateUtilitiesService.addDaysToDate(environment.expiresDaysDelay, new Date()), []],
|
||||
isZeroKnoledge: [false, [Validators.required]],
|
||||
isProtectedByPassword: [false, [Validators.required]],
|
||||
isOwnerNotifiedByEmailOnNewVote: [true, [Validators.required]],
|
||||
isOwnerNotifiedByEmailOnNewComment: [true, [Validators.required]],
|
||||
areResultsPublic: [true, [Validators.required]],
|
||||
richTextMode: [false, [Validators.required]],
|
||||
isYesAnswerAvailable: [true, [Validators.required]],
|
||||
isMaybeAnswerAvailable: [true, [Validators.required]],
|
||||
isNoAnswerAvailable: [true, [Validators.required]],
|
||||
allowComments: [true, [Validators.required]],
|
||||
maxCountOfAnswers: ['', []],
|
||||
hasMaxCountOfAnswers: ['', [Validators.required]],
|
||||
useVoterUniqueLink: [false, [Validators.required]],
|
||||
voterEmailList: ['', []],
|
||||
hasSeveralHours: [true, []],
|
||||
hideResults: [false, []],
|
||||
allowNewDateTime: [true, [Validators.required]],
|
||||
});
|
||||
this.form = form;
|
||||
return form;
|
||||
}
|
||||
|
||||
/**
|
||||
* set default configs to the form
|
||||
*/
|
||||
public patchFormDefaultValues() {
|
||||
this.form.patchValue({
|
||||
title: 'Mon titre de sondage',
|
||||
description: '',
|
||||
custom_url: this.uuidService.getUUID(),
|
||||
creatorPseudo: '',
|
||||
creatorEmail: '',
|
||||
whoModifiesAnswers: 'everybody',
|
||||
whoCanChangeAnswers: 'everybody',
|
||||
isProtectedByPassword: false,
|
||||
richTextMode: false,
|
||||
areResultsPublic: true,
|
||||
expiresDaysDelay: environment.expiresDaysDelay,
|
||||
maxCountOfAnswers: 1000,
|
||||
voterEmailList: '',
|
||||
password: '',
|
||||
});
|
||||
this.setDefaultDatesForInterval();
|
||||
}
|
||||
|
||||
/**
|
||||
* get a new slug from form title and creation date
|
||||
*/
|
||||
public updateSlug(): void {
|
||||
this.form.patchValue({ custom_url: this.makeSlug(this.form) });
|
||||
}
|
||||
private toastService: ToastService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* auto fetch a poll when route is looking for one in the administration pattern
|
||||
* DO NOT USE - needs refacto
|
||||
* @param route
|
||||
* @param state
|
||||
*/
|
||||
public async resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<Poll> {
|
||||
console.log('resolve route,state', route, state);
|
||||
const segments: string[] = state.url.split('/');
|
||||
const wantedcustom_url: string = segments.includes('poll') ? segments[segments.indexOf('poll') + 1] : '';
|
||||
|
||||
if (
|
||||
!this._poll.getValue() ||
|
||||
!this._poll.getValue().custom_url ||
|
||||
this._poll.getValue().custom_url !== wantedcustom_url
|
||||
) {
|
||||
if (this.pass_hash) {
|
||||
this.storageService.vote_stack.pass_hash = this.pass_hash;
|
||||
await this.loadPollByCustomUrlWithPasswordHash(wantedcustom_url, this.pass_hash);
|
||||
} else {
|
||||
await this.loadPollByCustomUrl(wantedcustom_url);
|
||||
}
|
||||
const wantedSlug: string = segments.includes('poll') ? segments[segments.indexOf('poll') + 1] : '';
|
||||
if (!wantedSlug && state.url.includes('administration')) {
|
||||
// creation of new poll
|
||||
const poll = new Poll(this.userService.getCurrentUser(), this.uuidService.getUUID(), '');
|
||||
this._poll.next(poll);
|
||||
this.router.navigate(['poll/' + poll.slug + '/administration']);
|
||||
}
|
||||
const loadedPoll = this._poll.getValue();
|
||||
if (loadedPoll) {
|
||||
this.storageService.vote_stack.custom_url = loadedPoll.custom_url;
|
||||
return loadedPoll;
|
||||
if (!this._poll.getValue() || !this._poll.getValue().slug || this._poll.getValue().slug !== wantedSlug) {
|
||||
await this.loadPollBySlug(wantedSlug);
|
||||
}
|
||||
if (this._poll.getValue()) {
|
||||
return this._poll.getValue();
|
||||
} else {
|
||||
this.router.navigate(['page-not-found']);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get all polls
|
||||
*/
|
||||
getAllAvailablePolls(): void {
|
||||
getAllAvailablePolls() {
|
||||
const baseHref = environment.api.version.apiV1.baseHref;
|
||||
console.log('getAllAvailablePolls baseHref', baseHref);
|
||||
const headers = ApiService.makeHeaders();
|
||||
@ -284,281 +64,40 @@ export class PollService implements Resolve<Poll> {
|
||||
console.log('getAllAvailablePolls res', res);
|
||||
});
|
||||
} catch (e) {
|
||||
console.log('getAllAvailablePolls e', e);
|
||||
console.error('getAllAvailablePolls e', e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* load a poll data and update the current poll of PollService
|
||||
* @param custom_url
|
||||
*/
|
||||
public async loadPollByCustomUrl(custom_url: string): Promise<void> {
|
||||
if (custom_url) {
|
||||
const poll: Poll | undefined = await this.apiService.getPollByCustomUrl(custom_url);
|
||||
|
||||
if (poll) {
|
||||
this.updateCurrentPoll(poll);
|
||||
this.titleService.setTitle(`☑️ ${poll.title} - ${environment.appTitle}`);
|
||||
} else {
|
||||
this.toastService.display(`sondage ${custom_url} non trouvé`);
|
||||
this.router.navigate(['page-not-found']);
|
||||
}
|
||||
} else {
|
||||
this.toastService.display(`sondage sans custom url : ${custom_url}`);
|
||||
public async loadPollBySlug(slug: string): Promise<void> {
|
||||
console.log('slug', slug);
|
||||
if (slug) {
|
||||
const poll: Poll | undefined = await this.apiService.getPollBySlug(slug);
|
||||
console.log({ loadPollBySlugResponse: poll });
|
||||
this.updateCurrentPoll(poll);
|
||||
}
|
||||
}
|
||||
|
||||
public async loadPollByCustomUrlWithPasswordHash(custom_url: string, hash: string): Promise<void> {
|
||||
if (custom_url) {
|
||||
const poll: Poll | undefined = await this.apiService.getPollByCustomUrlWithHash(custom_url, hash);
|
||||
|
||||
if (poll) {
|
||||
this.updateCurrentPoll(poll);
|
||||
this.titleService.setTitle(`☑️ ${poll.title} - ${environment.appTitle}`);
|
||||
} else {
|
||||
this.toastService.display(`sondage ${custom_url} non trouvé`);
|
||||
this.router.navigate(['page-not-found']);
|
||||
}
|
||||
} else {
|
||||
this.toastService.display(`sondage sans custom url : ${custom_url}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* update poll and parse its fields
|
||||
* @param poll
|
||||
*/
|
||||
public updateCurrentPoll(poll: Poll, displayToast = false): Poll {
|
||||
console.log('this.storageService.vote_stack.id', this.storageService.vote_stack.id);
|
||||
public updateCurrentPoll(poll: Poll): void {
|
||||
this._poll.next(poll);
|
||||
console.log('next poll', poll);
|
||||
|
||||
this.storageService.setChoicesForVoteStack(poll.choices);
|
||||
if (displayToast) {
|
||||
this.toastService.display(`sondage ${poll.title} bien mis à jour`, 'success');
|
||||
}
|
||||
return poll;
|
||||
}
|
||||
|
||||
/**
|
||||
* add all the dates between the start and end dates in the interval section
|
||||
*/
|
||||
addIntervalOfDates(): void {
|
||||
const newIntervalArray = this.DateUtilitiesService.getDatesInRange(
|
||||
this.DateUtilitiesService.parseInputDateToDateObject(new Date(this.startDateInterval)),
|
||||
this.DateUtilitiesService.parseInputDateToDateObject(new Date(this.endDateInterval)),
|
||||
1
|
||||
);
|
||||
|
||||
const converted = [];
|
||||
newIntervalArray.forEach((element) => {
|
||||
converted.push({
|
||||
literal: element.literal,
|
||||
date_object: element.date_object,
|
||||
timeList: [
|
||||
{
|
||||
literal: 'matin',
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
this.dateChoiceList = [...new Set(converted)];
|
||||
// add only dates that are not already present with a Set of unique items
|
||||
console.log('this.dateChoiceList', this.dateChoiceList);
|
||||
this.showDateInterval = false;
|
||||
|
||||
this.form.patchValue({ choices: this.dateChoiceList });
|
||||
|
||||
this.toastService.display(`les dates ont été ajoutées aux réponses possibles.`);
|
||||
}
|
||||
|
||||
/**
|
||||
* handle keyboard shortcuts
|
||||
* @param $event
|
||||
* @param choice_number
|
||||
*/
|
||||
keyOnChoice($event: KeyboardEvent, choice_number: number): void {
|
||||
$event.preventDefault();
|
||||
|
||||
const lastChoice = this.choices.length - 1 === choice_number;
|
||||
// reset field with Ctrl + D
|
||||
// add a field with Ctrl + N
|
||||
// go to previous timeSlice with arrow up
|
||||
// go to next timeSlice with arrow down
|
||||
|
||||
if ($event.key == 'ArrowUp' && choice_number > 0) {
|
||||
this.focusOnChoice(choice_number - 1);
|
||||
}
|
||||
if ($event.key == 'ArrowDown') {
|
||||
// add a field if we are on the last timeSlice
|
||||
if (lastChoice) {
|
||||
this.addChoice();
|
||||
this.toastService.display('choix ajouté par raccourci "flèche bas"');
|
||||
} else {
|
||||
this.focusOnChoice(choice_number + 1);
|
||||
}
|
||||
}
|
||||
if ($event.ctrlKey && $event.key == 'Backspace') {
|
||||
this.deleteChoiceField(choice_number);
|
||||
this.toastService.display('choix supprimé par raccourci "Ctrl + retour"');
|
||||
this.focusOnChoice(Math.min(choice_number - 1, 0));
|
||||
}
|
||||
if ($event.ctrlKey && $event.key == 'Enter') {
|
||||
// go to other fields
|
||||
const elem = this.document.querySelector('#creatorEmail');
|
||||
if (elem) {
|
||||
elem.focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* change time spans
|
||||
*/
|
||||
addTime() {
|
||||
this.timeList.push({
|
||||
literal: '',
|
||||
});
|
||||
}
|
||||
|
||||
removeAllTimes() {
|
||||
this.timeList = [];
|
||||
}
|
||||
|
||||
resetTimes() {
|
||||
this.timeList = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* add a time period to a specific date timeSlice,
|
||||
* focus on the new input
|
||||
* @param config
|
||||
* @param id
|
||||
*/
|
||||
addTimeToDate(config: any, id: number) {
|
||||
this.timeList.push({
|
||||
literal: '',
|
||||
});
|
||||
const selector = '[ng-reflect-choice_label="dateTime_' + id + '_Choices_' + (this.timeList.length - 1) + '"]';
|
||||
const elem = this.document.querySelector(selector);
|
||||
if (elem) {
|
||||
elem.focus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* convert form data to DTO to create a new poll, and store the admin key
|
||||
*/
|
||||
public createPoll(): Promise<any> {
|
||||
this.toastService.display('sending...');
|
||||
const newpoll = this.newPollFromForm();
|
||||
return this.apiService.createPoll(newpoll).then(
|
||||
(resp: any) => {
|
||||
console.log('poll created resp', resp);
|
||||
this.admin_key = resp.data.poll.admin_key;
|
||||
this.storageService.userPolls.push(resp.data.poll);
|
||||
},
|
||||
(error) => {
|
||||
this.toastService.display('BOOM, the createPoll went wrong');
|
||||
this.apiService.ousideHandleError(error);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* default interval of dates proposed is from today to 7 days more
|
||||
*/
|
||||
setDefaultDatesForInterval(): void {
|
||||
const dateCurrent = new Date();
|
||||
const dateJson = dateCurrent.toISOString();
|
||||
this.startDateInterval = dateJson.substring(0, 10);
|
||||
this.endDateInterval = this.DateUtilitiesService.addDaysToDate(this.intervalDaysDefault, dateCurrent)
|
||||
.toISOString()
|
||||
.substring(0, 10);
|
||||
this.form.patchValue({
|
||||
startDateInterval: this.startDateInterval,
|
||||
endDateInterval: this.endDateInterval,
|
||||
});
|
||||
this.countDays();
|
||||
}
|
||||
|
||||
askInitFormDefault(): void {
|
||||
this.initFormDefault(environment.autofill_creation);
|
||||
// this.toastService.display('formulaire réinitialisé');
|
||||
}
|
||||
|
||||
countDays(): void {
|
||||
this.intervalDays = this.DateUtilitiesService.countDays(
|
||||
this.DateUtilitiesService.parseInputDateToDateObject(new Date(this.startDateInterval)),
|
||||
this.DateUtilitiesService.parseInputDateToDateObject(new Date(this.endDateInterval))
|
||||
);
|
||||
}
|
||||
|
||||
focusOnChoice(index): void {
|
||||
const selector = '#choice_label_' + index;
|
||||
const elem = this.document.querySelector(selector);
|
||||
if (elem) {
|
||||
elem.focus();
|
||||
}
|
||||
}
|
||||
|
||||
deleteChoiceField(index: number): void {
|
||||
if (this.choices.length !== 1) {
|
||||
this.choices.removeAt(index);
|
||||
}
|
||||
}
|
||||
|
||||
initFormDefault(showDemoValues = true): void {
|
||||
this.form = this.createFormGroup();
|
||||
this.patchFormDefaultValues();
|
||||
this.setDefaultDatesForInterval();
|
||||
|
||||
if (showDemoValues) {
|
||||
this.setDemoValues();
|
||||
}
|
||||
}
|
||||
|
||||
get choices(): FormArray {
|
||||
return this.form.get('choices') as FormArray;
|
||||
}
|
||||
|
||||
reinitChoices(): void {
|
||||
this.choices.setValue([]);
|
||||
}
|
||||
|
||||
addChoice(optionalLabel = ''): void {
|
||||
const newControlGroup = this.fb.group({
|
||||
label: this.fb.control('', [Validators.required]),
|
||||
imageUrl: ['', [Validators.required]],
|
||||
});
|
||||
|
||||
if (optionalLabel) {
|
||||
newControlGroup.patchValue({
|
||||
label: optionalLabel,
|
||||
imageUrl: 'mon url',
|
||||
});
|
||||
}
|
||||
this.choices.push(newControlGroup);
|
||||
|
||||
this.focusOnChoice(this.choices.length - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* make a uniq slug for the current poll creation
|
||||
* @param form
|
||||
* @param config
|
||||
*/
|
||||
makeSlug(form: FormGroup): string {
|
||||
makeSlug(config: Poll): string {
|
||||
console.log('config', config);
|
||||
let str = '';
|
||||
str =
|
||||
form.value.created_at.getFullYear() +
|
||||
config.configuration.dateCreated.getFullYear() +
|
||||
'_' +
|
||||
(form.value.created_at.getMonth() + 1) +
|
||||
(config.configuration.dateCreated.getMonth() + 1) +
|
||||
'_' +
|
||||
form.value.created_at.getDate() +
|
||||
config.configuration.dateCreated.getDate() +
|
||||
'_' +
|
||||
form.value.creatorPseudo +
|
||||
config.owner.pseudo +
|
||||
'_' +
|
||||
form.value.title;
|
||||
config.title;
|
||||
str = str.replace(/^\s+|\s+$/g, ''); // trim
|
||||
str = str.toLowerCase();
|
||||
|
||||
@ -581,47 +120,41 @@ export class PollService implements Resolve<Poll> {
|
||||
const pollUrl: Subscription = await this.apiService.createPoll(this._poll.getValue());
|
||||
// TODO: Maybe handle the url to update currentPoll according to backend response
|
||||
if (pollUrl) {
|
||||
console.log('pollUrl', pollUrl);
|
||||
this.toastService.display('Le sondage a été enregistré.');
|
||||
} else {
|
||||
this.toastService.display('Le sondage n’a été correctement enregistré, veuillez ré-essayer.');
|
||||
}
|
||||
}
|
||||
|
||||
public saveParticipation(choice: Choice, user: Owner, response: Answer): void {
|
||||
public saveParticipation(choice: Choice, user: User, response: Answer): void {
|
||||
const currentPoll = this._poll.getValue();
|
||||
currentPoll.choices.find((c) => c.name === choice.name)?.updateParticipation(user, response);
|
||||
currentPoll.choices.find((c) => c.label === choice.label)?.updateParticipation(user, response);
|
||||
this.updateCurrentPoll(currentPoll);
|
||||
this.apiService.createParticipation(currentPoll.custom_url, choice.name, user.pseudo, response);
|
||||
this.apiService.createParticipation(currentPoll.slug, choice.label, user.pseudo, response);
|
||||
this.toastService.display('Votre participation au sondage a été enregistrée.');
|
||||
}
|
||||
|
||||
public async deleteAllAnswers(): Promise<void> {
|
||||
await this.apiService.deletePollAnswers(this._poll.getValue().custom_url);
|
||||
await this.apiService.deletePollAnswers(this._poll.getValue().slug);
|
||||
this.toastService.display('Les participations des votants à ce sondage ont été supprimées.');
|
||||
}
|
||||
|
||||
public async addComment(comment: CommentDTO): Promise<void> {
|
||||
await this.apiService.createComment(this._poll.getValue().custom_url, comment).then(
|
||||
(resp) => {
|
||||
console.log('resp', resp);
|
||||
this.loadPollByCustomUrl(this._poll.getValue().custom_url);
|
||||
console.log('resp', resp);
|
||||
this.toastService.display('Votre commentaire a été enregistré.');
|
||||
},
|
||||
(err) => this.apiService.ousideHandleError(err)
|
||||
);
|
||||
public async addComment(comment: string): Promise<void> {
|
||||
await this.apiService.createComment(this._poll.getValue().slug, comment);
|
||||
this.toastService.display('Votre commentaire a été enregistré.');
|
||||
}
|
||||
|
||||
public async deleteComments(): Promise<void> {
|
||||
await this.apiService.deletePollComments(this._poll.getValue().custom_url);
|
||||
await this.apiService.deletePollComments(this._poll.getValue().slug);
|
||||
this.toastService.display('Les commentaires de ce sondage ont été supprimés.');
|
||||
}
|
||||
|
||||
public buildAnswersByChoiceLabelByPseudo(poll: Poll): Map<string, Map<string, Answer>> {
|
||||
const pseudos: Set<string> = new Set();
|
||||
poll.choices.forEach((choice: Choice) => {
|
||||
choice.participants.forEach((users: Set<Owner>) => {
|
||||
users.forEach((user: Owner) => {
|
||||
choice.participants.forEach((users: Set<User>) => {
|
||||
users.forEach((user: User) => {
|
||||
pseudos.add(user.pseudo);
|
||||
});
|
||||
});
|
||||
@ -633,16 +166,16 @@ export class PollService implements Resolve<Poll> {
|
||||
pseudo,
|
||||
new Map<string, Answer>(
|
||||
poll.choices.map((choice: Choice) => {
|
||||
return [choice.name, undefined];
|
||||
return [choice.label, undefined];
|
||||
})
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
poll.choices.forEach((choice: Choice) => {
|
||||
choice.participants.forEach((users: Set<Owner>, answer: Answer) => {
|
||||
users.forEach((user: Owner) => {
|
||||
list.get(user.pseudo).set(choice.name, answer);
|
||||
choice.participants.forEach((users: Set<User>, answer: Answer) => {
|
||||
users.forEach((user: User) => {
|
||||
list.get(user.pseudo).set(choice.label, answer);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -650,221 +183,61 @@ export class PollService implements Resolve<Poll> {
|
||||
return list;
|
||||
}
|
||||
|
||||
public getParticipationUrlFromForm(): string {
|
||||
return `${environment.frontDomain}#/poll/${this.form.value.custom_url}/consultation`;
|
||||
}
|
||||
newPollFromForm(form: any): any {
|
||||
const newpoll = new Poll(
|
||||
this.userService.getCurrentUser(),
|
||||
this.uuidService.getUUID(),
|
||||
form.controls.title.value
|
||||
);
|
||||
/**
|
||||
* convert to API version 1 config poll
|
||||
*/
|
||||
const apiV1Poll = {
|
||||
menuVisible: true,
|
||||
expiracyDateDefaultInDays: newpoll.configuration.expiresDaysDelay,
|
||||
deletionDateAfterLastModification: newpoll.configuration.expiracyAfterLastModificationInDays,
|
||||
pollType: newpoll.configuration.isAboutDate ? 'dates' : 'classic', // classic or dates
|
||||
title: newpoll.title,
|
||||
description: newpoll.description,
|
||||
myName: newpoll.owner.pseudo,
|
||||
myComment: '',
|
||||
isAdmin: true, // when we create a poll, we are admin on it
|
||||
myVoteStack: {},
|
||||
myTempVoteStack: 0,
|
||||
myEmail: newpoll.owner.email,
|
||||
myPolls: [], // list of retrieved polls from the backend api
|
||||
/*
|
||||
date specific poll, we have the choice to setup different hours (timeList) for all possible dates (dateList), or use the same hours for all dates
|
||||
*/
|
||||
allowSeveralHours: 'true',
|
||||
// access
|
||||
visibility: newpoll.configuration.areResultsPublic, // visible to one with the link:
|
||||
voteChoices: newpoll.configuration.isMaybeAnswerAvailable ? 'yes, maybe, no' : 'yes', // possible answers to a vote choice: only "yes", "yes, maybe, no"
|
||||
creationDate: new Date(),
|
||||
expirationDate: '', // expiracy date
|
||||
voteStackId: null, // id of the vote stack to update
|
||||
pollId: null, // id of the current poll when created. data given by the backend api
|
||||
pollSlug: null, // id of the current poll when created. data given by the backend api
|
||||
currentPoll: null, // current poll selected with createPoll or getPoll of ConfigService
|
||||
passwordAccess: newpoll.configuration.isProtectedByPassword,
|
||||
password: newpoll.configuration.password,
|
||||
customUrl: newpoll.slug, // custom slug in the url, must be unique
|
||||
customUrlIsUnique: null, // given by the backend
|
||||
urlSlugPublic: null,
|
||||
urlPublic: null,
|
||||
urlAdmin: null,
|
||||
adminKey: '', // key to change config of the poll
|
||||
owner_modifier_token: '', // key to change a vote stack
|
||||
canModifyAnswers: newpoll.configuration.isAllowingtoChangeOwnAnswers, // bool for the frontend selector
|
||||
whoCanChangeAnswers: newpoll.configuration.whoCanChangeAnswers, // everybody, self, nobody (: just admin)
|
||||
dateList: newpoll.dateChoices, // sets of days as strings, config to set identical time for days in a special days poll
|
||||
timeList: newpoll.timeChoices, // ranges of time expressed as strings
|
||||
|
||||
public getAdministrationUrlFromForm(): string {
|
||||
// admin_key is filled after creation
|
||||
// example http://localhost:4200/#/administration/key/8Ubcg2YI99f69xz946cn4O64bQAeb
|
||||
|
||||
return `${environment.frontDomain}#/administration/key/${this.admin_key}`;
|
||||
}
|
||||
|
||||
public getParticipationUrl(): string {
|
||||
// http://localhost:4200/#/poll/dessin-anime/consultation
|
||||
|
||||
// handle secure access
|
||||
// http://localhost:4200/#/poll/citron/consultation/secure/1c01ed9c94fc640a1be864f197ff808c
|
||||
// http://localhost:4200/#/poll/citron/consultation/prompt pour entrer le pass à double hasher en md5
|
||||
|
||||
let url = '';
|
||||
let suffix_password = '';
|
||||
const currentPoll = this._poll.getValue();
|
||||
if (this._poll && currentPoll) {
|
||||
if (currentPoll.password) {
|
||||
// handle pass access
|
||||
suffix_password = '/prompt';
|
||||
}
|
||||
if (currentPoll) {
|
||||
url = `${environment.frontDomain}/#/poll/${currentPoll.custom_url}/consultation${suffix_password}`;
|
||||
} else {
|
||||
url = `${environment.frontDomain}/#/poll/${this.form.value.custom_url}/consultation${suffix_password}`;
|
||||
}
|
||||
} else {
|
||||
url = `${environment.frontDomain}/#/poll/${this.form.value.custom_url}/consultation${suffix_password}`;
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
public getAdministrationUrl(): string {
|
||||
// http://localhost:4200/#/admin/9S75b70ECXI5J5xDc058d3H40H9r2CHfO0Kj8T02EK2U8rY8fYTn-eS659j2Dhp794Oa6R1b9V70e3WGaE30iD9h45zwdm76C85SWB4LcUCrc7e0Ncc0
|
||||
|
||||
let url = '';
|
||||
if (this._poll && this._poll.getValue) {
|
||||
const polltemp = this._poll.getValue();
|
||||
if (polltemp) {
|
||||
url = `${environment.frontDomain}/#/admin/${polltemp.admin_key}`;
|
||||
}
|
||||
} else {
|
||||
url = `${environment.frontDomain}/#/admin/${this.form.value.admin_key}`;
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* enrich vote stack with missing default votes
|
||||
* @param vote_stack
|
||||
*/
|
||||
enrichVoteStackWithCurrentPollChoicesDefaultVotes(vote_stack: Stack) {
|
||||
if (this._poll && this._poll.getValue) {
|
||||
const polltemp = this._poll.getValue();
|
||||
polltemp.choices.map((choice) => {
|
||||
// for each vote, if it has the choice_id, do nothing, else, add a default vote
|
||||
if (!this.findExistingVoteFromChoiceId(choice.id, vote_stack.votes)) {
|
||||
vote_stack.votes.push(new Vote(choice.id));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* find an existing vote in vote_stack from its choice_id
|
||||
* @param choice_id
|
||||
* @param votes
|
||||
*/
|
||||
findExistingVoteFromChoiceId(choice_id: number, votes: Vote[]) {
|
||||
return votes.find((vote: Vote) => {
|
||||
if (vote.choice_id === choice_id) {
|
||||
return vote;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* convertir les dates de la propriété Calendar en objets de saisie de texte
|
||||
*/
|
||||
convertCalendarToText() {
|
||||
console.log('this.dateChoiceList', this.dateChoiceList);
|
||||
|
||||
if (this.calendar && this.calendar.length) {
|
||||
let converted = [];
|
||||
for (let someDate of this.calendar) {
|
||||
converted.push(this.DateUtilitiesService.convertDateToDateChoiceObject(someDate));
|
||||
}
|
||||
|
||||
this.dateChoiceList = converted.sort((first: any, second: any) => {
|
||||
return first.date_object - second.date_object;
|
||||
});
|
||||
return converted;
|
||||
} else {
|
||||
this.dateChoiceList = [];
|
||||
}
|
||||
return this.dateChoiceList;
|
||||
}
|
||||
|
||||
/**
|
||||
* convert the DateChoices to an arrray of Dates for calendar picker
|
||||
*/
|
||||
convertTextToCalendar(): Date[] {
|
||||
console.log('convert text to calendar', this.dateChoiceList);
|
||||
let converted = [];
|
||||
for (let someDateChoice of this.dateChoiceList) {
|
||||
let dateObj = new Date(someDateChoice.date_input);
|
||||
console.log('dateObj', dateObj);
|
||||
// check that date is not part of the disabled dates
|
||||
if (this.disabled_dates.indexOf(dateObj) === -1) {
|
||||
converted.push(dateObj);
|
||||
}
|
||||
}
|
||||
|
||||
console.log('converted', converted);
|
||||
this.calendar = converted;
|
||||
return converted;
|
||||
}
|
||||
|
||||
patchFormWithPoll(poll: Poll) {
|
||||
this.form.patchValue({
|
||||
...poll,
|
||||
isAboutDate: poll.kind == 'date',
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @description convert to API version 1 data transition object
|
||||
*/
|
||||
newPollFromForm(): Poll {
|
||||
let form = this.form;
|
||||
const newOwner = this.storageService.vote_stack.owner;
|
||||
|
||||
newOwner.pseudo = form.value.creatorPseudo;
|
||||
newOwner.email = form.value.creatorEmail;
|
||||
const newpoll = new Poll(newOwner, form.value.custom_url, form.value.title);
|
||||
|
||||
const pollKeys = Object.keys(newpoll);
|
||||
const formFields = Object.keys(form.value);
|
||||
newpoll.allowed_answers = [];
|
||||
|
||||
// comparer les champs de formulaire avec le DTO de création de sondage
|
||||
for (const pk of pollKeys) {
|
||||
if (formFields.indexOf(pk) !== -1) {
|
||||
const field = form.value[pk];
|
||||
newpoll[pk] = field;
|
||||
} else {
|
||||
console.log('newPollFromForm : manque pollKey', pk);
|
||||
}
|
||||
}
|
||||
|
||||
if (form.value.isYesAnswerAvailable) {
|
||||
newpoll.allowed_answers.push('yes');
|
||||
}
|
||||
if (form.value.isMaybeAnswerAvailable) {
|
||||
newpoll.allowed_answers.push('maybe');
|
||||
}
|
||||
if (form.value.isNoAnswerAvailable) {
|
||||
newpoll.allowed_answers.push('no');
|
||||
}
|
||||
newpoll.description = form.value.description;
|
||||
newpoll.has_several_hours = form.value.hasSeveralHours;
|
||||
newpoll.max_count_of_answers = form.value.maxCountOfAnswers | (1024 * 10);
|
||||
newpoll.maxCountOfAnswers = form.value.maxCountOfAnswers | (1024 * 10);
|
||||
newpoll.password = form.value.password;
|
||||
newpoll.kind = form.value.isAboutDate ? 'date' : 'classic';
|
||||
newpoll.allow_comments = form.value.allowComments;
|
||||
// merge choices from storage
|
||||
if (form.value.isAboutDate) {
|
||||
// first we convert calendar picker dates.
|
||||
// we want a list of date object, and we want the kind of dates who was lastly edited by the user
|
||||
// depending on the manual or datepicker mode, we need to get a converted list of dates
|
||||
let convertedDates = [];
|
||||
if (this.mode_calendar) {
|
||||
// mode calendar date picker, we take the list of date objects in calendar property
|
||||
convertedDates = this.calendar;
|
||||
} else {
|
||||
// mode text, we convert to calendar list, and take that list
|
||||
convertedDates = this.convertTextToCalendar();
|
||||
}
|
||||
|
||||
console.log('this.calendar', this.calendar);
|
||||
|
||||
for (let elem of convertedDates) {
|
||||
console.log('elem', elem);
|
||||
let converted_day = this.DateUtilitiesService.convertDateToDateChoiceObject(elem);
|
||||
newpoll.dateChoices.push(converted_day);
|
||||
}
|
||||
console.log('newpoll.dateChoices', newpoll.dateChoices);
|
||||
} else {
|
||||
// text choices
|
||||
newpoll.choicesText = Object.assign([], this.storageService.choicesText);
|
||||
}
|
||||
newpoll.choices = Object.assign([], this.storageService.choices);
|
||||
// newpoll.dateChoices = Object.assign([], this.storageService.dateChoices);
|
||||
newpoll.timeSlices = Object.assign([], this.storageService.timeSlices);
|
||||
console.log('newpoll', newpoll);
|
||||
return newpoll;
|
||||
}
|
||||
|
||||
/**
|
||||
* copy public url of new poll
|
||||
* @param textToCopy
|
||||
*/
|
||||
copyText(textToCopy: string) {
|
||||
this._clipboardService.copyFromContent(textToCopy);
|
||||
|
||||
this.translate.get('success.copy_message').subscribe((resp) => {
|
||||
console.log('resp', resp);
|
||||
this.toastService.display(`${resp} ${textToCopy}`);
|
||||
});
|
||||
answers: newpoll.choices,
|
||||
// modals
|
||||
displayConfirmVoteModalAdmin: false,
|
||||
};
|
||||
console.log('apiV1Poll', apiV1Poll);
|
||||
return apiV1Poll;
|
||||
}
|
||||
}
|
||||
|
@ -1,156 +0,0 @@
|
||||
import { HttpHeaders } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Poll } from '../models/poll.model';
|
||||
import { Comment } from '../models/comment.model';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class PollUtilitiesService {
|
||||
// utils functions
|
||||
/**
|
||||
* generate unique id to have a default url for future poll
|
||||
*/
|
||||
makeUuid() {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||
const r = (Math.random() * 16) | 0,
|
||||
v = c == 'x' ? r : (r & 0x3) | 0x8;
|
||||
return v.toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* make a uniq custom_url for the current poll creation
|
||||
* @param str
|
||||
*/
|
||||
makeSlug(config: Poll) {
|
||||
let str = '';
|
||||
const creation = new Date(config.creation_date);
|
||||
|
||||
str =
|
||||
creation.getFullYear() +
|
||||
'_' +
|
||||
(creation.getMonth() + 1) +
|
||||
'_' +
|
||||
creation.getDate() +
|
||||
'_' +
|
||||
config.creatorPseudo +
|
||||
'_' +
|
||||
config.title;
|
||||
|
||||
return this.makeSlugFromString(str);
|
||||
}
|
||||
|
||||
makeSlugFromString(text: string): string {
|
||||
let str = text.replace(/^\s+|\s+$/g, ''); // trim
|
||||
str = str.toLowerCase();
|
||||
|
||||
// remove accents, swap ñ for n, etc
|
||||
const from = 'àáäâèéëêìíïîòóöôùúüûñç·/_,:;';
|
||||
const to = 'aaaaeeeeiiiioooouuuunc------';
|
||||
for (let i = 0, l = from.length; i < l; i++) {
|
||||
str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
|
||||
}
|
||||
|
||||
str = str
|
||||
.replace(/[^a-z0-9 -]/g, '') // remove invalid chars
|
||||
.replace(/\s+/g, '-') // collapse whitespace and replace by -
|
||||
.replace(/-+/g, '-'); // collapse dashes
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* prepare headers like the charset and json type for any call to the backend
|
||||
* @param bodyContent
|
||||
*/
|
||||
makeHeaders(bodyContent?: any) {
|
||||
// const headerDict = {
|
||||
// Charset: 'UTF-8',
|
||||
// 'Content-Type': 'application/json',
|
||||
// Accept: 'application/json',
|
||||
// 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
||||
// 'Access-Control-Allow-Origin': '*',
|
||||
// };
|
||||
|
||||
return {
|
||||
headers: [],
|
||||
body: bodyContent,
|
||||
};
|
||||
}
|
||||
|
||||
exportCSV(poll: Poll): void {
|
||||
let rows = [];
|
||||
const now = new Date();
|
||||
const headers = [
|
||||
['export de sondage Framadate ', poll.custom_url],
|
||||
['le', now.toISOString()],
|
||||
[poll.id, poll.title, poll.custom_url, poll.creation_date],
|
||||
['pseudo'],
|
||||
];
|
||||
|
||||
const listOfChoices = ['choices : '];
|
||||
poll.choices.map((choice) => {
|
||||
listOfChoices.push(choice.name);
|
||||
});
|
||||
listOfChoices.push('pseudo');
|
||||
|
||||
poll.stacks.map((voteStack) => {
|
||||
const voteStackInArray = [voteStack.pseudo];
|
||||
const keysVotes = Object.keys(voteStack.votes);
|
||||
|
||||
keysVotes.map((id) => {
|
||||
voteStackInArray.push(voteStack.votes[id].value ? voteStack.votes[id].value : '');
|
||||
});
|
||||
rows.push(voteStackInArray);
|
||||
});
|
||||
const headersComments = [['comments'], ['pseudo', 'text', 'creation_date']];
|
||||
const comments = [];
|
||||
poll.comments.map((item: Comment) => {
|
||||
comments.push([item.pseudo, item.text, new Date(item.created_at), '\n']);
|
||||
});
|
||||
headers.push(listOfChoices);
|
||||
rows = [headers, listOfChoices, rows, headersComments, comments];
|
||||
|
||||
const convertedCsv = rows
|
||||
.map((elem) => {
|
||||
console.log('elem', elem);
|
||||
return elem
|
||||
.map((item) => {
|
||||
console.log('item', item);
|
||||
if (typeof item === typeof Array) {
|
||||
return item.join('\n');
|
||||
}
|
||||
return item;
|
||||
})
|
||||
.join('\n');
|
||||
})
|
||||
.join('\n');
|
||||
console.log('rows', rows);
|
||||
console.log('convertedCsv', convertedCsv);
|
||||
|
||||
const csvContent = 'data:text/csv;charset=utf-8,' + convertedCsv;
|
||||
console.log('csvContent', csvContent);
|
||||
const encodedUri = encodeURI(csvContent);
|
||||
const link = document.createElement('a');
|
||||
link.setAttribute('href', encodedUri);
|
||||
const exportFileName =
|
||||
(poll.custom_url ? poll.custom_url : this.makeSlug(poll)) + '_export_' + new Date() + '.csv';
|
||||
link.setAttribute('download', exportFileName);
|
||||
document.body.appendChild(link); // Required for FF
|
||||
link.click(); // This will download the data file named "my_data.csv".
|
||||
}
|
||||
|
||||
download(filename: string, text: string): void {
|
||||
const element = document.createElement('a');
|
||||
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
|
||||
element.setAttribute('download', filename);
|
||||
|
||||
element.style.display = 'none';
|
||||
document.body.appendChild(element);
|
||||
|
||||
element.click();
|
||||
|
||||
document.body.removeChild(element);
|
||||
}
|
||||
}
|
@ -1,14 +1,8 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { LocalStorage } from 'ngx-webstorage';
|
||||
|
||||
import { Language } from '../enums/language.enum';
|
||||
import { Theme } from '../enums/theme.enum';
|
||||
import { Stack } from '../models/stack.model';
|
||||
import { Choice, ChoiceText } from '../models/choice.model';
|
||||
import { Vote } from '../models/vote.model';
|
||||
import { environment } from '../../../environments/environment';
|
||||
import { DateChoice, defaultTimeOfDay, TimeSlices } from '../../../../mocks/old-stuff/config/defaultConfigs';
|
||||
import { Poll } from '../models/poll.model';
|
||||
import { Owner } from '../models/owner.model';
|
||||
import { DateUtilitiesService } from './date.utilities.service';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
@ -18,129 +12,11 @@ export class StorageService {
|
||||
public theme: Theme;
|
||||
|
||||
@LocalStorage()
|
||||
public language: string;
|
||||
public language: Language;
|
||||
|
||||
@LocalStorage()
|
||||
public userPolls: Poll[] = [];
|
||||
public userPollsIds: string[];
|
||||
|
||||
@LocalStorage()
|
||||
public dateChoices: DateChoice[] = [];
|
||||
|
||||
@LocalStorage()
|
||||
public timeSlices: TimeSlices[] = defaultTimeOfDay;
|
||||
|
||||
@LocalStorage()
|
||||
public vote_stack: Stack = new Stack();
|
||||
|
||||
/**
|
||||
* choix de dates
|
||||
*/
|
||||
@LocalStorage()
|
||||
public choices: Choice[] = [];
|
||||
|
||||
/**
|
||||
* choix textes dans un sondage classique
|
||||
*/
|
||||
@LocalStorage()
|
||||
public choicesText: ChoiceText[] = [
|
||||
// {
|
||||
// name: 'example choice text',
|
||||
// url_display: 'https://www.cipherbliss.com/wp-content/uploads/2018/03/IMG_20180302_181945-300x169.jpg',
|
||||
// url_href: 'https://www.cipherbliss.com/wp-content/uploads/2018/03/IMG_20180302_181945-300x169.jpg',
|
||||
// },
|
||||
{
|
||||
name: '',
|
||||
url_display: '',
|
||||
url_href: '',
|
||||
},
|
||||
];
|
||||
|
||||
constructor(public dateUtilities: DateUtilitiesService) {
|
||||
if (environment.autofill_participation) {
|
||||
this.userPolls.push(new Poll(new Owner(), 'Démo: Anniversaire de tonton Patrick', 'aujourdhui-ou-demain'));
|
||||
this.userPolls.push(new Poll(new Owner(), 'Démo: Atelier cuisine du quartier', 'aujourdhui-ou-demain'));
|
||||
this.userPolls.push(
|
||||
new Poll(new Owner(), 'Démo: Réunion du département des chatons', 'aujourdhui-ou-demain')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* set default choices for the vote stack from the poll choices objects
|
||||
* @param choices_list
|
||||
*/
|
||||
setChoicesForVoteStack(choices_list: Choice[]) {
|
||||
// change only if the poll custom_url changed or if there is no stack id for this poll
|
||||
|
||||
if (!this.vote_stack.id) {
|
||||
this.vote_stack = new Stack();
|
||||
for (const choice of choices_list) {
|
||||
// if (environment.autofill_participation) {
|
||||
// console.log('autofill au hasard des votes à ce sondage');
|
||||
// this.toastService.display('autofill au hasard des votes à ce sondage');
|
||||
// const defaultvalue = Math.random() > 0.75 ? 'yes' : '';
|
||||
// this.vote_stack.votes.push(new Vote(timeSlice.id, defaultvalue));
|
||||
// } else {
|
||||
this.vote_stack.votes.push(new Vote(choice.id));
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* look for a timeSlice in the stored vote stack and change it answer
|
||||
* @param choice_id
|
||||
* @param value
|
||||
*/
|
||||
toggleAnswer(choice_id: number, value: string) {
|
||||
for (const vote of this.vote_stack.votes) {
|
||||
if (vote.choice_id == choice_id) {
|
||||
if (vote.value == value) {
|
||||
vote.value = '';
|
||||
} else {
|
||||
vote.value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* check for the value of a timeSlice in the stored vote stack
|
||||
* @param choice_id
|
||||
* @param value
|
||||
*/
|
||||
choiceHasAnswerOfValue(choice_id: number, value: any) {
|
||||
for (const vote of this.vote_stack.votes) {
|
||||
if (vote.choice_id == choice_id) {
|
||||
if (vote.value == value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* set all time slices of a timeSlice to the same answer at once
|
||||
* @param groupe
|
||||
* @param newAnswer
|
||||
*/
|
||||
setAllSubchoicesTo(groupe, newAnswer = 'yes') {
|
||||
groupe.choices.map((choice) => {
|
||||
for (const vote of this.vote_stack.votes) {
|
||||
if (vote.choice_id == choice.id) {
|
||||
vote.value = newAnswer;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* update vote stack from the backend
|
||||
* @param voteStack
|
||||
*/
|
||||
mapVotes(voteStack: Stack) {
|
||||
console.log('mapVotes voteStack', voteStack);
|
||||
this.vote_stack = voteStack;
|
||||
}
|
||||
public pseudo: string;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ export class ToastService {
|
||||
constructor(private _snackBar: MatSnackBar) {}
|
||||
|
||||
public display(message: string, action?: string): void {
|
||||
const config: MatSnackBarConfig = { duration: 4000, verticalPosition: 'top' };
|
||||
const config: MatSnackBarConfig = { duration: 2000 };
|
||||
this._snackBar.open(message, action, config);
|
||||
}
|
||||
}
|
||||
|
@ -2,25 +2,25 @@ import { Injectable } from '@angular/core';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
|
||||
import { UserRole } from '../enums/user-role.enum';
|
||||
import { Owner } from '../models/owner.model';
|
||||
import { User } from '../models/user.model';
|
||||
import { ApiService } from './api.service';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class UserService {
|
||||
public anonymous: Owner = new Owner('', '', [], UserRole.ANONYMOUS);
|
||||
public anonymous: User = new User('', '', [], UserRole.ANONYMOUS);
|
||||
|
||||
private _user: BehaviorSubject<Owner> = new BehaviorSubject<Owner>(this.anonymous);
|
||||
public readonly user: Observable<Owner> = this._user.asObservable();
|
||||
private _user: BehaviorSubject<User> = new BehaviorSubject<User>(this.anonymous);
|
||||
public readonly user: Observable<User> = this._user.asObservable();
|
||||
|
||||
constructor(private apiService: ApiService) {}
|
||||
|
||||
public updateUser(user: Owner): void {
|
||||
public updateUser(user: User): void {
|
||||
this._user.next(user);
|
||||
}
|
||||
|
||||
public getCurrentUser(): Owner {
|
||||
public getCurrentUser(): User {
|
||||
return this._user.getValue();
|
||||
}
|
||||
|
||||
@ -29,12 +29,12 @@ export class UserService {
|
||||
}
|
||||
|
||||
public async getUserPolls(): Promise<void> {
|
||||
const currentUser: Owner = this._user.getValue();
|
||||
currentUser.polls = await this.apiService.findMyPollsByEmail(currentUser.email);
|
||||
const currentUser: User = this._user.getValue();
|
||||
currentUser.polls = await this.apiService.getPollsUrlsByUserEmail(currentUser.email);
|
||||
this.updateUser(currentUser);
|
||||
}
|
||||
|
||||
public async sendEmailToUserTheListOfItsPolls(): Promise<void> {
|
||||
await this.apiService.findMyPollsByEmail(this._user.getValue().email);
|
||||
await this.apiService.sendEmailToUserOfItsPollsList(this._user.getValue().email);
|
||||
}
|
||||
}
|
||||
|