Migrating to a new development image.
This commit is contained in:
parent
44ee169aa6
commit
e960664eb0
|
@ -0,0 +1,489 @@
|
|||
"
|
||||
I model a member of a Brea site, usually a human.
|
||||
"
|
||||
Class {
|
||||
#name : #BreaMember,
|
||||
#superclass : #Object,
|
||||
#instVars : [
|
||||
'givenName',
|
||||
'familyName',
|
||||
'picture',
|
||||
'country',
|
||||
'tags',
|
||||
'email',
|
||||
'password',
|
||||
'webPresence',
|
||||
'organizations'
|
||||
],
|
||||
#category : #Brea
|
||||
}
|
||||
|
||||
{ #category : #converting }
|
||||
BreaMember >> asStonModified [
|
||||
"asSton is generated a core dumped now. This renaming is trying to solve that. Maybe
|
||||
in the offical release it will be solved"
|
||||
^ STON toStringPretty: self
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> country [
|
||||
^ country
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> country: anObject [
|
||||
country := anObject
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> countryTemplate [
|
||||
^ '{{#country}}
|
||||
<tr>
|
||||
<td class="mdl-data-table__cell--non-numeric"><b>Country</b></td>
|
||||
<td class="mdl-data-table__cell--non-numeric">{{.}}</td>
|
||||
</tr>
|
||||
{{/country}}' asMustacheTemplate value: self
|
||||
]
|
||||
|
||||
{ #category : #helpers }
|
||||
BreaMember >> createTestUser [
|
||||
^ self class new
|
||||
givenName: 'Test';
|
||||
familyName: 'User';
|
||||
country: 'Neverland';
|
||||
memberOf: 'HackBo' withWebsite: 'http://hackbo.co/';
|
||||
memberOf: 'mutabiT' withWebsite: 'http://mutabit.com/';
|
||||
website: 'http://test.user';
|
||||
twitter: '@offrayLC';
|
||||
email: 'iam@test.user';
|
||||
tags: 'just, a lot, of words, separated, by commas'.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> email [
|
||||
^ email
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> email: anEmailAddress [
|
||||
email := (SHA1 new hashMessage: anEmailAddress) hex
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> facebook [
|
||||
^ self webPresence facebook.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> facebook: aProfileName [
|
||||
aProfileName = ''
|
||||
ifTrue: [ self webPresence facebook: nil ]
|
||||
ifFalse: [ self webPresence facebook: aProfileName ]
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> facebookTemplate [
|
||||
^ '{{#facebook}}
|
||||
<tr>
|
||||
<td class="mdl-data-table__cell--non-numeric">
|
||||
<b>Facebook</b></td>
|
||||
<td class="mdl-data-table__cell--non-numeric">
|
||||
<a href="https://facebook.com/{{.}}">
|
||||
{{.}}</a></td>
|
||||
</tr>
|
||||
{{/facebook}}' asMustacheTemplate value: self
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> familyName [
|
||||
^ familyName
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> familyName: anObject [
|
||||
familyName := anObject
|
||||
]
|
||||
|
||||
{ #category : #helpers }
|
||||
BreaMember >> fullName [
|
||||
^ self givenName asLowercase, '-', self familyName asLowercase
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> getGenericProfilePicture [
|
||||
"Other considered avatars where:
|
||||
'https://upload.wikimedia.org/wikipedia/commons/1/1e/Default-avatar.jpg'"
|
||||
self picture: 'https://www.jamf.com/jamf-nation/img/default-avatars/generic-user.png'.
|
||||
^ picture
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> givenName [
|
||||
^ givenName
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> givenName: anObject [
|
||||
givenName := anObject
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> head [
|
||||
^ '<head>', self headMeta, self headTitle, self headStyles,'</head>'
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaMember >> headMeta [
|
||||
^ '<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="description" content="A portfolio template that uses Material Design Lite.">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">'
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaMember >> headStyles [
|
||||
^ '
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&lang=en">
|
||||
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.grey-pink.min.css" />
|
||||
<link rel="stylesheet" href="http://mutabit.com/repos.fossil/gig/doc/tip/styles.css" />
|
||||
<link rel="stylesheet" href="styles.css" />
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||
'
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaMember >> headTitle [
|
||||
^ self headTitled: 'GIG: Network'
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaMember >> headTitled: aString [
|
||||
^ '<title>', aString ,'</title>'
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> html [
|
||||
"I show the member profile as HTML"
|
||||
^ self head, self htmlOutput
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> htmlInput [
|
||||
"I capture data in a HTML Form and use it to create a new BreaMember"
|
||||
^ '
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="description" content="A portfolio template that uses Material Design Lite.">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
|
||||
<title>Add Member | GIG Network</title>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&lang=en">
|
||||
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.grey-pink.min.css" />
|
||||
<link rel="stylesheet" href="styles.css" />
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||
</head>
|
||||
<body>
|
||||
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-header">
|
||||
<div class="mdl-layout__drawer mdl-layout--small-screen-only">
|
||||
<nav class="mdl-navigation mdl-typography--body-1-force-preferred-font">
|
||||
<a class="mdl-navigation__link is-active" href="index.html">Portfolio</a>
|
||||
<a class="mdl-navigation__link" href="blog.html">Blog</a>
|
||||
<a class="mdl-navigation__link" href="about.html">About</a>
|
||||
<a class="mdl-navigation__link" href="contact.html">Contact</a>
|
||||
</nav>
|
||||
</div>
|
||||
<main class="mdl-layout__content">
|
||||
<div class="mdl-grid portfolio-max-width portfolio-contact">
|
||||
<div class="mdl-cell mdl-cell--12-col mdl-card mdl-shadow--4dp">
|
||||
<div class="mdl-card__title">
|
||||
<h2 class="mdl-card__title-text">Add new member</h2>
|
||||
</div>
|
||||
<div class="mdl-card__supporting-text">
|
||||
<p>
|
||||
Fill out the form.
|
||||
The fields preceded by [*] are obligatory.
|
||||
</p>
|
||||
<form enctype="application/x-www-form-urlencoded" action="summit" method="POST" class="">
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" pattern="[A-Z,a-z, ]*" type="text" name="givenName">
|
||||
<label class="mdl-textfield__label" for="givenName">[*]Given Name...</label>
|
||||
<span class="mdl-textfield__error">Letters and spaces only</span>
|
||||
</div>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" pattern="[A-Z,a-z, ]*" type="text" name="familyName">
|
||||
<label class="mdl-textfield__label" for="familyName">[*]Family Name...</label>
|
||||
<span class="mdl-textfield__error">Letters and spaces only</span>
|
||||
</div><br>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" type="text" name="email">
|
||||
<label class="mdl-textfield__label" for="email">[*]Email...</label>
|
||||
</div>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" pattern="[A-Z,a-z, ]*" type="text" name="country">
|
||||
<label class="mdl-textfield__label" for="country">[*]Country...</label>
|
||||
<span class="mdl-textfield__error">Letters and spaces only</span>
|
||||
</div><br>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" pattern="[A-Z,a-z, ]*" type="text" name="organizations">
|
||||
<label class="mdl-textfield__label" for="organizations">
|
||||
[*]Organization(s) (separated with commas)</label>
|
||||
<span class="mdl-textfield__error">Letters and spaces only</span>
|
||||
</div><br>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" type="text" name="picture">
|
||||
<label class="mdl-textfield__label" for="website">Profile picture url...</label>
|
||||
</div>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" type="text" name="website">
|
||||
<label class="mdl-textfield__label" for="website">Personal website...</label>
|
||||
</div><br>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" type="text" name="twitter">
|
||||
<label class="mdl-textfield__label" for="twitter">Twitter...</label>
|
||||
</div>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<input class="mdl-textfield__input" type="text" name="facebook">
|
||||
<label class="mdl-textfield__label" for="facebook">Facebook...</label>
|
||||
</div><br>
|
||||
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
|
||||
<textarea class="mdl-textfield__input" type="text" rows="5" name="tags"></textarea>
|
||||
<label class="mdl-textfield__label" for="tags">Tags (separated with commas)...</label>
|
||||
</div>
|
||||
<p>
|
||||
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect
|
||||
mdl-button--accent" type="submit" value="Submit">
|
||||
Submit
|
||||
</button>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="mdl-mini-footer">
|
||||
<div class="mdl-mini-footer__left-section">
|
||||
<div class="mdl-logo">Simple portfolio website</div>
|
||||
</div>
|
||||
<div class="mdl-mini-footer__right-section">
|
||||
<ul class="mdl-mini-footer__link-list">
|
||||
<li><a href="#">Help</a></li>
|
||||
<li><a href="#">Privacy & Terms</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</footer>
|
||||
</main>
|
||||
</div>
|
||||
<script src="https://code.getmdl.io/1.3.0/material.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
'
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> htmlOutput [
|
||||
|
||||
^ self htmlOutputTemplate asMustacheTemplate value: self
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> htmlOutputTemplate [
|
||||
"I show the member profile as HTML"
|
||||
^ '<div class="mdl-grid portfolio-max-width">
|
||||
<div class="mdl-cell mdl-card mdl-shadow--4dp portfolio-card">
|
||||
<div class="mdl-card__title">
|
||||
<h2 class="mdl-card__title-text">{{givenName}} {{familyName}}</h2>
|
||||
</div>
|
||||
<div class="mdl-card__media">
|
||||
<img class="article-image"
|
||||
src="{{picture}}"
|
||||
border="0" alt="">
|
||||
</div>
|
||||
<div class="mdl-card__supporting-text">
|
||||
<table class="mdl-data-table mdl-js-data-table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="mdl-data-table__cell--non-numeric"><b>Name</b></td>
|
||||
<td class="mdl-data-table__cell--non-numeric">{{givenName}} {{familyName}}</td>
|
||||
</tr>',
|
||||
self countryTemplate,
|
||||
self organizationsTemplate,
|
||||
self websiteTemplate,
|
||||
self twitterTemplate,
|
||||
self facebookTemplate,
|
||||
self tagsTemplate,
|
||||
'
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mdl-card__actions mdl-card--border">
|
||||
<a class="mdl-button mdl-button--colored mdl-js-button
|
||||
mdl-js-ripple-effect mdl-button--accent"
|
||||
href="portfolio-example01.html">Read more</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
'
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> instagram [
|
||||
^ self webPresence instagram.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> instagram: aProfileName [
|
||||
self webPresence instagram: aProfileName
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> memberOf: anOrgName [
|
||||
self organizations add:
|
||||
(BreaOrganization new name: anOrgName)
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> memberOf: anOrgName withWebsite: aUrl [
|
||||
self organizations add:
|
||||
(BreaOrganization new
|
||||
name: anOrgName;
|
||||
website: aUrl)
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> organizations [
|
||||
^ organizations ifNil: [ organizations := OrderedCollection new ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> organizations: anOrgListOrName [
|
||||
anOrgListOrName splitOn: ',' do: [ :each | self memberOf: each ]
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> organizationsTemplate [
|
||||
^ '
|
||||
<tr>
|
||||
<td class="mdl-data-table__cell--non-numeric"><b>Organization(s)</b></td>
|
||||
<td class="mdl-data-table__cell--non-numeric">
|
||||
{{#organizations}}
|
||||
<a href="{{website}}">{{name}}</a>
|
||||
{{/organizations}}
|
||||
</td>
|
||||
</tr>' asMustacheTemplate value: self
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> password [
|
||||
^ password
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> password: anObject [
|
||||
password := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> picture [
|
||||
^ picture ifNil: [ ^ self getGenericProfilePicture ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> picture: anImageFilePath [
|
||||
picture := anImageFilePath
|
||||
]
|
||||
|
||||
{ #category : #helpers }
|
||||
BreaMember >> renderTestUserAsHtml [
|
||||
^ self class new createTestUser html
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaMember >> storeInto: aFileDirectory [
|
||||
| folder file |
|
||||
folder := (aFileDirectory asFileReference / self fullName) ensureCreateDirectory.
|
||||
file := (folder / 'info.ston') ensureCreateFile.
|
||||
file writeStreamDo: [:stream |
|
||||
(STON writer on: stream)
|
||||
newLine: String crlf;
|
||||
prettyPrint: true;
|
||||
nextPut: self]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> tags [
|
||||
^ tags
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> tags: anObject [
|
||||
tags := anObject
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> tagsTemplate [
|
||||
^ '{{#tags}}
|
||||
<tr>
|
||||
<td colspan="2"; style="text-align:left">
|
||||
<b>Tags</b><br>
|
||||
{{.}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/tags}}' asMustacheTemplate value: self
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> twitter [
|
||||
^ self webPresence twitter.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> twitter: aProfileName [
|
||||
aProfileName = ''
|
||||
ifTrue: [ self webPresence twitter: nil ]
|
||||
ifFalse: [ self webPresence twitter: aProfileName ]
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> twitterTemplate [
|
||||
^ '{{#twitter}}
|
||||
<tr>
|
||||
<td class="mdl-data-table__cell--non-numeric">
|
||||
<b>Twitter</b></td>
|
||||
<td class="mdl-data-table__cell--non-numeric">
|
||||
<a href="https://twitter.com/{{.}}">
|
||||
{{.}}</a></td>
|
||||
</tr>
|
||||
{{/twitter}}' asMustacheTemplate value: self
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> webPresence [
|
||||
^ webPresence ifNil: [ webPresence := BreaWebPresence new ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> webPresence: anObject [
|
||||
webPresence := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> website [
|
||||
^ self webPresence website.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaMember >> website: anUrl [
|
||||
self webPresence website: anUrl
|
||||
]
|
||||
|
||||
{ #category : #public }
|
||||
BreaMember >> websiteTemplate [
|
||||
^ '{{#website}}
|
||||
<tr>
|
||||
<td class="mdl-data-table__cell--non-numeric"><b>Website</b></td>
|
||||
<td class="mdl-data-table__cell--non-numeric">
|
||||
<a href="{{.}}">{{.}}</a>
|
||||
</td>
|
||||
{{/website}}' asMustacheTemplate value: self
|
||||
]
|
|
@ -0,0 +1,8 @@
|
|||
"
|
||||
A BreaMemberTest is a test class for testing the behavior of BreaMember
|
||||
"
|
||||
Class {
|
||||
#name : #BreaMemberTest,
|
||||
#superclass : #TestCase,
|
||||
#category : #'Brea-Tests'
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
"
|
||||
I store the places a BreaMember is affiliated to.
|
||||
"
|
||||
Class {
|
||||
#name : #BreaOrganization,
|
||||
#superclass : #Object,
|
||||
#instVars : [
|
||||
'name',
|
||||
'website'
|
||||
],
|
||||
#category : #Brea
|
||||
}
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaOrganization >> name [
|
||||
^ name
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaOrganization >> name: anObject [
|
||||
name := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaOrganization >> website [
|
||||
^ website
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaOrganization >> website: anObject [
|
||||
website := anObject
|
||||
]
|
|
@ -0,0 +1,54 @@
|
|||
"
|
||||
I store the common forms of web presence a BreaMember can have online.
|
||||
"
|
||||
Class {
|
||||
#name : #BreaWebPresence,
|
||||
#superclass : #Object,
|
||||
#instVars : [
|
||||
'website',
|
||||
'twitter',
|
||||
'facebook',
|
||||
'instagram'
|
||||
],
|
||||
#category : #Brea
|
||||
}
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebPresence >> facebook [
|
||||
^ facebook
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebPresence >> facebook: anObject [
|
||||
facebook := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebPresence >> instagram [
|
||||
^ instagram
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebPresence >> instagram: anObject [
|
||||
instagram := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebPresence >> twitter [
|
||||
^ twitter
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebPresence >> twitter: anObject [
|
||||
twitter := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebPresence >> website [
|
||||
^ website
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebPresence >> website: anObject [
|
||||
website := anObject
|
||||
]
|
|
@ -0,0 +1,301 @@
|
|||
"
|
||||
I model the fossil repository where public data is stored for the
|
||||
building of this web site.
|
||||
"
|
||||
Class {
|
||||
#name : #BreaWebsite,
|
||||
#superclass : #Object,
|
||||
#instVars : [
|
||||
'fossilRepo',
|
||||
'server',
|
||||
'template',
|
||||
'title',
|
||||
'widgets'
|
||||
],
|
||||
#category : #Brea
|
||||
}
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite class >> availableTemplates [
|
||||
self templates keys.
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite class >> demoFolder [
|
||||
^ FileLocator temp asFileReference / 'BreaDemo'.
|
||||
]
|
||||
|
||||
{ #category : #example }
|
||||
BreaWebsite class >> example [
|
||||
"I run an example mockup of a website using Brea.
|
||||
After runing me, go to:
|
||||
- http://localhost:8080/demo
|
||||
- http://localhost:8080/members/test
|
||||
- http://localhost:8080/members/add "
|
||||
self new
|
||||
local: FileLocator temp asFileReference / 'BreaDemo';
|
||||
template: 'portafolio';
|
||||
downloadTemplate;
|
||||
modifyTemplate;
|
||||
start
|
||||
]
|
||||
|
||||
{ #category : #example }
|
||||
BreaWebsite class >> exampleDashboard [
|
||||
"I run an example mockup of a website using Brea.
|
||||
After runing me, go to: http://localhost:8080/demo "
|
||||
self new
|
||||
local: FileLocator temp asFileReference / 'BreaDemo';
|
||||
template: 'dashboard';
|
||||
downloadTemplate;
|
||||
modifyTemplate;
|
||||
start
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaWebsite class >> stopAll [
|
||||
"I stop the server"
|
||||
Teapot stopAll
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite class >> templates [
|
||||
"I provide the supported MDL templates taken from: https://getmdl.io/templates/"
|
||||
^ Dictionary new
|
||||
at: 'portafolio' put: 'https://code.getmdl.io/1.3.0/mdl-template-portfolio.zip';
|
||||
at: 'dashboard' put: 'https://code.getmdl.io/1.3.0/mdl-template-dashboard.zip';
|
||||
yourself.
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> defaultTemplate [
|
||||
self template
|
||||
ifNil: [
|
||||
self template: 'portafolio' ].
|
||||
^ self template.
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> downloadDefaultTemplate [
|
||||
self downloadTemplateNamed: self defaultTemplate Into: self local.
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> downloadDefaultTemplateInto: aDirectory [
|
||||
| remoteUrl templatesFile |
|
||||
aDirectory ensureDeleteAll.
|
||||
aDirectory ensureCreateDirectory.
|
||||
remoteUrl := self class templates at: self template.
|
||||
GrafoscopioUtils
|
||||
downloadingFrom: remoteUrl
|
||||
withMessage: 'Downloading templates'
|
||||
into: FileLocator temp asFileReference.
|
||||
templatesFile := FileLocator temp asFileReference / (remoteUrl splitOn: '/') last.
|
||||
ZipArchive new
|
||||
readFrom: templatesFile;
|
||||
extractAllTo: aDirectory
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> downloadTemplate [
|
||||
self downloadTemplateNamed: self template Into: self local asFileReference.
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> downloadTemplateNamed: aName Into: aDirectory [
|
||||
"aName: String aDirectory: aFileLocation"
|
||||
| remoteUrl templatesFile |
|
||||
aDirectory ensureDeleteAll.
|
||||
aDirectory ensureCreateDirectory.
|
||||
remoteUrl := self class templates at: aName.
|
||||
GrafoscopioUtils
|
||||
downloadingFrom: remoteUrl
|
||||
withMessage: 'Downloading templates'
|
||||
into: FileLocator temp asFileReference.
|
||||
templatesFile := FileLocator temp asFileReference / (remoteUrl splitOn: '/') last.
|
||||
ZipArchive new
|
||||
readFrom: templatesFile;
|
||||
extractAllTo: aDirectory
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> fossilRepo [
|
||||
^ fossilRepo ifNil: [ fossilRepo := FossilRepo new ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> fossilRepo: aFossilRepo [
|
||||
fossilRepo := aFossilRepo
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> local [
|
||||
^ self fossilRepo local
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaWebsite >> local: aFilePath [
|
||||
"I define the local storage of the Fossil repository.
|
||||
For the moment aFilePath must be an absolute "
|
||||
| localSite |
|
||||
localSite := aFilePath asFileReference.
|
||||
localSite exists
|
||||
ifFalse: [ localSite ensureCreateDirectory].
|
||||
self fossilRepo local: aFilePath.
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaWebsite >> local: aFilePath remote: anUrl [
|
||||
"I define the local and remote storages of the Fossil repository"
|
||||
self remote: anUrl.
|
||||
self local: aFilePath
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> modifyDashboardTemplate [
|
||||
"I replace default templates with versioned files, that contains Mustache tags used
|
||||
for examples."
|
||||
"This part should be factorized and integrated into a single method tha modifies any
|
||||
template, instead of repeated the code of modifyPortafolioTemplate."
|
||||
| remoteRepoUrl files |
|
||||
remoteRepoUrl := 'http://mutabit.com/repos.fossil/brea/templates/portafolio'.
|
||||
files := #('index.html' 'styles.css').
|
||||
"files do: [ :file |
|
||||
GrafoscopioUtils
|
||||
downloadingFrom: remoteRepoUrl, 'doc/tip/', file
|
||||
withMessage: 'Replacing ', file
|
||||
into: self local ]"
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> modifyPortafolioTemplate [
|
||||
"I replace default templates with versioned files, that contains Mustache tags used
|
||||
for examples."
|
||||
| remoteRepoUrl files |
|
||||
remoteRepoUrl := 'http://mutabit.com/repos.fossil/gig/'.
|
||||
files := #('index.html' 'styles.css').
|
||||
files do: [ :file |
|
||||
GrafoscopioUtils
|
||||
downloadingFrom: remoteRepoUrl, 'doc/tip/', file
|
||||
withMessage: 'Replacing ', file
|
||||
into: self local ]
|
||||
]
|
||||
|
||||
{ #category : #utility }
|
||||
BreaWebsite >> modifyTemplate [
|
||||
"I replace default templates with versioned files, that contains Mustache tags used
|
||||
for examples."
|
||||
self template = 'portafolio' ifTrue: [ self modifyPortafolioTemplate ].
|
||||
self template = 'dashboard' ifTrue: [ self modifyDashboardTemplate ]
|
||||
]
|
||||
|
||||
{ #category : #'input processing' }
|
||||
BreaWebsite >> processNewMember: request [
|
||||
| member badRequest |
|
||||
badRequest := [ ^ ZnResponse badRequest: request ].
|
||||
(request hasEntity
|
||||
and: [ request contentType matches: ZnMimeType applicationFormUrlEncoded ])
|
||||
ifFalse: [ badRequest ].
|
||||
member := BreaMember new
|
||||
givenName: (request at: #givenName);
|
||||
familyName: (request at: #familyName);
|
||||
email: (request at: #email);
|
||||
country: (request at: #country);
|
||||
organizations: (request at: #organizations);
|
||||
picture: (request at: #picture);
|
||||
website: (request at: #website);
|
||||
twitter: (request at: #twitter);
|
||||
facebook: (request at: #facebook);
|
||||
tags: (request at: #tags).
|
||||
self store: member.
|
||||
^ 'New member stored!'
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaWebsite >> remote: anUrl [
|
||||
"I define the remote storage of the Fossil repository"
|
||||
self remote: anUrl.
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaWebsite >> routes [
|
||||
"I define how the website behaves accordingly to particular routes."
|
||||
self server
|
||||
serveStatic: 'demo' from: (self local);
|
||||
GET: 'members/test' -> [ :req | BreaMember new renderTestUserAsHtml ];
|
||||
GET: 'members/add' -> [ :req | BreaMember new htmlInput ];
|
||||
POST: 'members/summit' -> [ :req | self processNewMember: req ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> server [
|
||||
^ server ifNil: [ self setup ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> server: anObject [
|
||||
server := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> setup [
|
||||
^ server := Teapot
|
||||
configure:
|
||||
{(#port -> 8080).
|
||||
(#debugMode -> true)}
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaWebsite >> start [
|
||||
"I define the config and start the server"
|
||||
self routes.
|
||||
self server start
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaWebsite >> storageFor: anObject [
|
||||
"I define the places where local storage is done for several types of objects"
|
||||
anObject class = BreaMember
|
||||
ifTrue: [ ^ self local asFileReference / 'members' ].
|
||||
^ self
|
||||
]
|
||||
|
||||
{ #category : #'server handling' }
|
||||
BreaWebsite >> store: anObject [
|
||||
"I store different kind of objects in the website repository.
|
||||
For the moment I will only store BreaMembers, but as long as new
|
||||
objects will emerge, I will specialize other ways of storage."
|
||||
anObject storeInto: (self storageFor: anObject)
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> template [
|
||||
^ template
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> template: aTemplateName [
|
||||
"I define the default template to be used for the Brea website.
|
||||
Available options are at self class templates."
|
||||
template := aTemplateName
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> title [
|
||||
^ title
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> title: anObject [
|
||||
title := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> widgets [
|
||||
^ widgets ifNil: [ widgets := OrderedCollection new ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWebsite >> widgets: anOrderedCollection [
|
||||
widgets := anOrderedCollection
|
||||
]
|
|
@ -0,0 +1,80 @@
|
|||
"
|
||||
I model a widget to be put, generally in a HTML view of a website.
|
||||
"
|
||||
Class {
|
||||
#name : #BreaWidget,
|
||||
#superclass : #Object,
|
||||
#instVars : [
|
||||
'source',
|
||||
'views'
|
||||
],
|
||||
#category : #Brea
|
||||
}
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWidget >> exportViewsTo: aFolder [
|
||||
self shouldBeImplemented
|
||||
]
|
||||
|
||||
{ #category : #'data visualization' }
|
||||
BreaWidget >> piechartFor: dataArray titled: aString colored: aPalette [
|
||||
"I create a pie chart for a subset of the data stored in a dataArray, which is an Association
|
||||
of keys and values.
|
||||
aselector should be a message undestood by the dataArray."
|
||||
| b lb |
|
||||
b := RTPieBuilder new.
|
||||
b interaction popup.
|
||||
b objects: dataArray.
|
||||
b slice: #value.
|
||||
b labeled.
|
||||
"And add the legend"
|
||||
lb := RTLegendBuilder new.
|
||||
lb view: b view.
|
||||
lb addText: aString.
|
||||
lb build.
|
||||
^ b
|
||||
]
|
||||
|
||||
{ #category : #'data visualization' }
|
||||
BreaWidget >> piechartFor: dataArray using: aSelector titled: aString colored: aPalette [
|
||||
"I create a pie chart for a subset of the data stored in a dataArray, which is an Association
|
||||
of keys and values.
|
||||
aselector should be a message undestood by the dataArray."
|
||||
| b lb |
|
||||
b := RTPieBuilder new.
|
||||
b interaction popup.
|
||||
b objects: dataArray.
|
||||
b slice: aSelector.
|
||||
b labeled.
|
||||
"And add the legend"
|
||||
lb := RTLegendBuilder new.
|
||||
lb view: b view.
|
||||
lb addText: 'Asitentes a talleres'.
|
||||
lb build.
|
||||
^ b
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWidget >> source [
|
||||
^ source
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWidget >> source: aUrl [
|
||||
source := aUrl
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWidget >> sourceAsJSON [
|
||||
^ NeoJSONReader fromString: self source asUrl retrieveContents
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWidget >> views [
|
||||
^ views ifNil: [ views := Dictionary new ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
BreaWidget >> views: anObject [
|
||||
views := anObject
|
||||
]
|
|
@ -0,0 +1 @@
|
|||
Package { #name : #Brea }
|
Loading…
Reference in New Issue