Compare commits
9 Commits
pkg/dev/ub
...
issue-33
Author | SHA1 | Date | |
---|---|---|---|
69d6753f59 | |||
94bfb77d87 | |||
5a677d2491 | |||
fbb2b3f8da | |||
44182fd1cd | |||
4e9298f5b6 | |||
9dce43fd58 | |||
3fa2b5905a | |||
b456fe9f65 |
@ -9,6 +9,7 @@
|
|||||||
### Procédure
|
### Procédure
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
cd client && npm install # Installation des dépendances client
|
||||||
make watch # Surveiller les modifications sur le sources et compiler/démarrer le serveur
|
make watch # Surveiller les modifications sur le sources et compiler/démarrer le serveur
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
import { GiteaUnauthorizedError } from "../../util/gitea";
|
import { GiteaUnauthorizedError } from "../../util/gitea";
|
||||||
import { put } from 'redux-saga/effects';
|
import { put } from 'redux-saga/effects';
|
||||||
import { logout } from '../actions/logout';
|
import { logout } from '../actions/logout';
|
||||||
|
import { saveReferer } from "../../util/referer";
|
||||||
|
|
||||||
export function* failuresSaga(action) {
|
export function* failuresSaga(action) {
|
||||||
const err = action.error;
|
if (action.error instanceof GiteaUnauthorizedError) {
|
||||||
if (err instanceof GiteaUnauthorizedError) {
|
saveReferer();
|
||||||
yield put(logout());
|
yield put(logout());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ export function* fetchIssuesSaga(action: any) {
|
|||||||
if (pageIssues.length === 0) {
|
if (pageIssues.length === 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
issues.push(...pageIssues);
|
issues.push(...pageIssues.filter(issue => issue.pull_request === null));
|
||||||
page++;
|
page++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,13 +75,13 @@ function createCards(projects: Project[], issues: any, lane: BoardLane, rest: Se
|
|||||||
return projectIssues.reduce((projectCards: KanboardCard[], issue: any) => {
|
return projectIssues.reduce((projectCards: KanboardCard[], issue: any) => {
|
||||||
|
|
||||||
const hasLabel = issue.labels.some((l: any) => l.name === lane.issueLabel);
|
const hasLabel = issue.labels.some((l: any) => l.name === lane.issueLabel);
|
||||||
const card = getMemoizedKanboardCard(issue.id, issue.title, p, issue);
|
const { card, memoized } = getMemoizedKanboardCard(issue.id, issue.title, p, issue);
|
||||||
|
|
||||||
if (hasLabel) {
|
if (hasLabel) {
|
||||||
projectCards.push(card);
|
projectCards.push(card);
|
||||||
rest.delete(card);
|
rest.delete(card);
|
||||||
} else {
|
} else {
|
||||||
rest.add(card);
|
if (!memoized) rest.add(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
return projectCards;
|
return projectCards;
|
||||||
@ -95,11 +95,19 @@ function createCards(projects: Project[], issues: any, lane: BoardLane, rest: Se
|
|||||||
|
|
||||||
const kanboardCardMemo: {[key: string]: KanboardCard} = {};
|
const kanboardCardMemo: {[key: string]: KanboardCard} = {};
|
||||||
|
|
||||||
function getMemoizedKanboardCard(id: number, title: string, project: Project, issue: Issue): KanboardCard {
|
function getKanboardCardMemoizationKey(id: number, project: Project, issue: Issue) {
|
||||||
const key = `${project.id}-${issue.id}-${id}`;
|
return `${project.id}-${issue.id}-${id}`;
|
||||||
if (kanboardCardMemo.hasOwnProperty(key)) return kanboardCardMemo[key];
|
}
|
||||||
|
|
||||||
|
function isKanboardCardMemoized(key: string) {
|
||||||
|
return kanboardCardMemo.hasOwnProperty(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMemoizedKanboardCard(id: number, title: string, project: Project, issue: Issue) {
|
||||||
|
const key = getKanboardCardMemoizationKey(id, project, issue);
|
||||||
|
if (isKanboardCardMemoized(key)) return { card: kanboardCardMemo[key], memoized: true };
|
||||||
kanboardCardMemo[key] = { id, title, project, issue };
|
kanboardCardMemo[key] = { id, title, project, issue };
|
||||||
return kanboardCardMemo[key];
|
return { card: kanboardCardMemo[key], memoized: false };
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetKandboarCardMemo() {
|
function resetKandboarCardMemo() {
|
||||||
|
9
client/src/store/sagas/referer.ts
Normal file
9
client/src/store/sagas/referer.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { hasReferer, getReferer, clearReferer } from '../../util/referer';
|
||||||
|
|
||||||
|
export function* navigateToRefererSaga() {
|
||||||
|
if (!hasReferer()) return;
|
||||||
|
const referer = getReferer();
|
||||||
|
console.log("Redirecting to referer", referer);
|
||||||
|
clearReferer();
|
||||||
|
window.location.hash = referer;
|
||||||
|
}
|
@ -10,9 +10,11 @@ import { LOGOUT_REQUEST, LOGOUT_SUCCESS } from '../actions/logout';
|
|||||||
import { logoutSaga, logoutSuccessSaga } from './logout';
|
import { logoutSaga, logoutSuccessSaga } from './logout';
|
||||||
import { BUILD_KANBOARD_REQUEST, MOVE_CARD } from '../actions/kanboards';
|
import { BUILD_KANBOARD_REQUEST, MOVE_CARD } from '../actions/kanboards';
|
||||||
import { buildKanboardSaga, moveCardSaga, refreshKanboardSaga } from './kanboards';
|
import { buildKanboardSaga, moveCardSaga, refreshKanboardSaga } from './kanboards';
|
||||||
|
import { navigateToRefererSaga } from './referer';
|
||||||
|
|
||||||
export function* rootSaga() {
|
export function* rootSaga() {
|
||||||
yield all([
|
yield all([
|
||||||
|
navigateToRefererSaga(),
|
||||||
takeEvery(patternFromRegExp(/^.*_FAILURE/), failuresSaga),
|
takeEvery(patternFromRegExp(/^.*_FAILURE/), failuresSaga),
|
||||||
takeLatest(FETCH_BOARDS_REQUEST, fetchBoardsSaga),
|
takeLatest(FETCH_BOARDS_REQUEST, fetchBoardsSaga),
|
||||||
takeLatest(BUILD_KANBOARD_REQUEST, buildKanboardSaga),
|
takeLatest(BUILD_KANBOARD_REQUEST, buildKanboardSaga),
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { createStore, applyMiddleware } from 'redux'
|
import { createStore, applyMiddleware, compose } from 'redux'
|
||||||
import createSagaMiddleware from 'redux-saga'
|
import createSagaMiddleware from 'redux-saga'
|
||||||
import { rootReducer } from './reducers/root'
|
import { rootReducer } from './reducers/root'
|
||||||
import { rootSaga } from './sagas/root'
|
import { rootSaga } from './sagas/root'
|
||||||
@ -14,6 +14,8 @@ if (process.env.NODE_ENV !== 'production') {
|
|||||||
reduxMiddlewares.push(loggerMiddleware);
|
reduxMiddlewares.push(loggerMiddleware);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
|
||||||
|
|
||||||
// create the saga middleware
|
// create the saga middleware
|
||||||
const sagaMiddleware = createSagaMiddleware()
|
const sagaMiddleware = createSagaMiddleware()
|
||||||
reduxMiddlewares.push(sagaMiddleware);
|
reduxMiddlewares.push(sagaMiddleware);
|
||||||
@ -21,7 +23,7 @@ reduxMiddlewares.push(sagaMiddleware);
|
|||||||
// mount it on the Store
|
// mount it on the Store
|
||||||
export const store = createStore(
|
export const store = createStore(
|
||||||
rootReducer,
|
rootReducer,
|
||||||
applyMiddleware(...reduxMiddlewares)
|
composeEnhancers(applyMiddleware(...reduxMiddlewares)),
|
||||||
)
|
)
|
||||||
|
|
||||||
// then run the saga
|
// then run the saga
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
export class GiteaUnauthorizedError extends Error {
|
export class GiteaUnauthorizedError extends Error {
|
||||||
constructor(...args: any[]) {
|
constructor(...args: any[]) {
|
||||||
super(...args)
|
super(...args)
|
||||||
|
Object.setPrototypeOf(this, GiteaUnauthorizedError.prototype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
19
client/src/util/referer.ts
Normal file
19
client/src/util/referer.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
const localStorage = window.localStorage;
|
||||||
|
const refererKey = 'referer';
|
||||||
|
|
||||||
|
export function getReferer() {
|
||||||
|
return localStorage.getItem(refererKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function saveReferer() {
|
||||||
|
console.log("Saving referer", window.location.hash);
|
||||||
|
localStorage.setItem(refererKey, window.location.hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function hasReferer() {
|
||||||
|
return !!getReferer();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function clearReferer() {
|
||||||
|
localStorage.removeItem(refererKey);
|
||||||
|
}
|
@ -28,7 +28,7 @@ func getServiceContainer(conf *config.Config) (*service.Container, error) {
|
|||||||
|
|
||||||
ctn.Provide(
|
ctn.Provide(
|
||||||
session.ServiceName,
|
session.ServiceName,
|
||||||
gorilla.ServiceProvider("gitea-kan", cookieStore),
|
gorilla.ServiceProvider("gengitkan", cookieStore),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Create and expose config service provider
|
// Create and expose config service provider
|
||||||
|
@ -20,6 +20,7 @@ type HTTPConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type GiteaConfig struct {
|
type GiteaConfig struct {
|
||||||
|
BaseURL string
|
||||||
ClientID string
|
ClientID string
|
||||||
ClientSecret string
|
ClientSecret string
|
||||||
RedirectURL string
|
RedirectURL string
|
||||||
|
Reference in New Issue
Block a user